0

我有许多文件,我需要自动给每个文件一个唯一的 ID 代码。

到目前为止,我已经设法做到以下几点:

datalist <- mapply(cbind, datalist, "temp1"=names(datalist), SIMPLIFY=F)

它将文件的名称放入一个新列中。

但后来我想添加一个数字,从 1:每个文件中的行数。

我已经尝试了几件事,但我并没有真正期望任何一个都能工作:(然后我打算将它们粘贴在一起并删除“临时”列 - 然后弄清楚如何在没有临时列的情况下一步完成):

datalist <- mapply(cbind, datalist, "temp2"=1:(sapply(datalist, nrow)), SIMPLIFY=F)

或者

datalist <- mapply(cbind, datalist, "temp2"=1:nrow(datalist), SIMPLIFY=F)

我可以获得列表中单个位的行数 ( nrow(datalist[[1]])),但不确定如何将其应用于所有行,无论列表中有多少。

它是一个 for 循环,还是有更好的方法?

示例数据集:

datalist <- structure(list(test.raw.data = structure(list(officer.sw = c("bob", 
NA, "brian", "brian", NA), officer.ne = c(NA, "angie", NA, NA, 
NA), officer.nw = c(NA, NA, NA, NA, "lola")), .Names = c("officer.sw", 
"officer.ne", "officer.nw"), class = "data.frame", row.names = c(NA, 
-5L)), test2.raw.data = structure(list(officer.sw = c("bob", 
"NA", "brian", "brian", "NA", "bob", "NA", "bob", "bob", "NA", 
"NA"), officer.ne = c("NA", "angie", "NA", "NA", "NA", "NA", 
"sandy", "NA", "NA", "NA", "NA"), officer.nw = c("NA", "NA", 
"NA", "NA", "lola", "NA", "NA", "NA", "NA", "lola", "NA"), officer.EM = c("NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "mr bendy"
), randomothercol = c("angie", "b", "c", "e", "d", "fg", "t", 
"wsefg", "aweg", "lola", "g")), .Names = c("officer.sw", "officer.ne", 
"officer.nw", "officer.EM", "randomothercol"), class = "data.frame", row.names = c(NA, 
-11L))), .Names = c("test.raw.data", "test2.raw.data"))
4

2 回答 2

1

尝试这个:

makeIndex <- function(x, name, sep="-"){
  cbind(index=paste(name, seq_along(x[[1]]), sep=sep), x)
}

lapply(seq_along(datalist), function(i)makeIndex(datalist[[i]], names(datalist)[i]))

结果:

[[1]]
            index officer.sw officer.ne officer.nw
1 test.raw.data-1        bob       <NA>       <NA>
2 test.raw.data-2       <NA>      angie       <NA>
3 test.raw.data-3      brian       <NA>       <NA>
4 test.raw.data-4      brian       <NA>       <NA>
5 test.raw.data-5       <NA>       <NA>       lola

[[2]]
               index officer.sw officer.ne officer.nw officer.EM randomothercol
1   test2.raw.data-1        bob         NA         NA         NA          angie
2   test2.raw.data-2         NA      angie         NA         NA              b
3   test2.raw.data-3      brian         NA         NA         NA              c
4   test2.raw.data-4      brian         NA         NA         NA              e
5   test2.raw.data-5         NA         NA       lola         NA              d
6   test2.raw.data-6        bob         NA         NA         NA             fg
7   test2.raw.data-7         NA      sandy         NA         NA              t
8   test2.raw.data-8        bob         NA         NA         NA          wsefg
9   test2.raw.data-9        bob         NA         NA         NA           aweg
10 test2.raw.data-10         NA         NA       lola         NA           lola
11 test2.raw.data-11         NA         NA         NA   mr bendy              g
于 2014-08-27T16:47:22.287 回答
1

datalist从帖子底部的原始内容开始,您可以在lapply通话中进行一些索引。

> lapply(seq(datalist), function(i) {
      datalist[[i]][[paste0("temp", i)]] <- 
          paste0(names(datalist)[i], seq(nrow(datalist[[i]])))
      datalist[[i]]
  })
# [[1]]
#   officer.sw officer.ne officer.nw          temp1
# 1        bob       <NA>       <NA> test.raw.data1
# 2       <NA>      angie       <NA> test.raw.data2
# ...
# 
# [[2]]
#    officer.sw officer.ne officer.nw officer.EM randomothercol            temp2
# 1         bob         NA         NA         NA          angie  test2.raw.data1
# 2          NA      angie         NA         NA              b  test2.raw.data2
# ...
于 2014-08-27T17:07:25.510 回答