为列中的每行文件提供唯一ID

时间:2014-08-27 16:39:35

标签: r list mapply

我有很多文件,我需要自动为每个文件提供一个唯一的ID代码。

到目前为止,我已成功完成以下任务:

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

将文件名放入新列。

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

我尝试了几件事,但我真的没想到要么工作: (然后我将它们粘贴在一起并删除&#39; temp&#39;列 - 然后找出如何在没有临时列的情况下一步完成它):

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"))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
# ...