如何将向量追加到data.frames列表?

时间:2017-06-29 07:41:17

标签: r list lapply sapply

如何将矢量cbind / append附加到data.frames列表?

l <- list(data.frame(a=c(1,2,3), b=c(1,2,3)), data.frame(a=c(1,2,3,4), b=c(1,2,3,4)))
l
file_name <- c("myfile.txt", "yourfile.txt")
file_name

我试过了:

lapply(l, function(x) cbind(l[[x]], fname = rep(file_name, each = nrow(l[[x]]))))

但是我收到了错误:

  

l [[x]]中的错误:无效的下标类型'list'

2 个答案:

答案 0 :(得分:1)

我们可以使用Mapcreate a new column 'fname' for each of the list`元素,将相应的'file_name'附加到其中

Map(cbind, l, fname = file_name)

如果我们使用lapply,则循环浏览list

的序列
lapply(seq_along(l), function(i) transform(l[[i]], fname = file_name[i]))

答案 1 :(得分:0)

只是为了确保..你有以下data.frames列表..

l <- list(data.frame(a=c(1,2,3), b=c(1,2,3)), data.frame(a=c(1,2,3,4), b=c(1,2,3,4)))
l
[[1]]
  a b
1 1 1
2 2 2
3 3 3

[[2]]
  a b
1 1 1
2 2 2
3 3 3
4 4 4

你最终想要将一个矢量(每个列表不同)与列表中的所有data.frames相关联..所以你想拥有

[[1]]
  a b v
1 1 1 a
2 2 2 b
3 3 3 c

[[2]]
  a b v
1 1 1 a
2 2 2 b 
3 3 3 c
4 4 4 d

我们可以做的一个技巧是首先使用rbindlist将所有帧组合在一起..并保留其ID

L = rbindlist(l,idcol = TRUE)

让我们说我们还有一个列表,我们想要附加到每个data.frame

v = list(data.frame(v = letters[1:3]), data.frame(v = LETTERS[1:4]))
V = rbindlist(v)

现在我们可以做一个简单的cbind,然后使用我们创建的.id分割列表

result = cbind(L,V)
final_result = split(result,on = ".id")

    $`1`
   .id a b v
1:   1 1 1 a
2:   1 2 2 b
3:   1 3 3 c

$`2`
   .id a b v
1:   2 1 1 A
2:   2 2 2 B
3:   2 3 3 C
4:   2 4 4 D

我们在那里仍然有一个.id列..但是那个摆脱那个不应该太麻烦..