我有list1
个数据帧,我希望稍后do.call("rbind", list1)
,但首先我要为每个数据帧添加一个识别因子。该因子应该是数据帧的名称:
list1 <- lapply(vector("list", 6), function(x)
data.frame(replicate(10,sample(0:1,1000,rep=TRUE))))
names(list1) <- LETTERS[1:6]
e.g。将“A”分配给第一个数据帧“A”的每一行,依此类推:
list[[1]]$Cat <- "A"
list[[2]]$Cat <- "B" #etc
我试过像
这样的东西list1 <- lapply(list1, function(x)
{list1[[x]]$Cat<- names(list1[[x]]); x})
但失败了:
Error in list1[[x]] : invalid subscript type 'list'
如何实现我想要的? 谢谢。
答案 0 :(得分:2)
使用tidyverse
包可以轻松完成此操作:
library( tidyverse )
imap( list1, ~mutate(.x, Cat = .y) ) %>% bind_rows
要解决这个问题:
imap
包的purrr
将第一个参数的每个元素(在本例中为list1
)与元素的名称一起传递给您在第二个参数中提供的函数。根据{{1}}约定,该函数可以使用imap
引用元素,使用.x
引用元素的名称。.y
包中的mutate
,这会创建一个名为dplyr
的新列。Cat
与您在问题中提供的bind_rows
相当。do.call( "rbind", list1 )
提供了一种方便的方法来自动添加标识原始data.frame的列:
bind_rows