关于将数据帧列表转换为单个数据帧(ex. here)的文章很多。但是,我需要这样做,同时保留来自哪个列表的信息 结果行是,即我需要保留原始列表的索引。如果列表未命名,我只需要一个索引号,而如果列表是命名的,则需要保存原始列表元素的名称。我该怎么办?
具有如下数据:
sqlite3.OperationalError: unable to open database file
我需要这样的输出:
foo <- list(data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)),
data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))
同时具有列表的命名元素:
index x y
1 1 a 1
2 1 b 2
3 1 c 3
4 2 d 4
5 2 e 5
6 2 f 6
输出为:
foo <- list(df1 = data.frame(x=c('a', 'b', 'c'),y = c(1,2,3)),
df2 = data.frame(x=c('d', 'e', 'f'),y = c(4,5,6)))
答案 0 :(得分:1)
如果未命名列表,则可以命名该列表,然后使用lapply
遍历它们以创建数据帧列表,并将rbind
一起作为一个数据帧。
names(foo) <- if (is.null(names(foo))) seq_len(length(foo)) else names(foo)
do.call("rbind", lapply(names(foo), function(x) cbind(index = x, foo[[x]])))
# index x y
#1 1 a 1
#2 1 b 2
#3 1 c 3
#4 2 d 4
#5 2 e 5
#6 2 f 6
对于命名列表
do.call("rbind", lapply(names(foo), function(x) cbind(index = x, foo[[x]])))
# index x y
#1 df1 a 1
#2 df1 b 2
#3 df1 c 3
#4 df2 d 4
#5 df2 e 5
#6 df2 f 6
答案 1 :(得分:1)
我们可以使用imap
来获取索引
library(purrr)
imap_dfr(foo, ~ .x %>%
mutate(index = .y))
或与map
map_dfr(foo, .f = cbind, .id = 'index')
# index x y
#1 1 a 1
#2 1 b 2
#3 1 c 3
#4 2 d 4
#5 2 e 5
#6 2 f 6
或者使用Map
中的base R
,在其中循环遍历'foo'的元素和相应的'foo'序列,cbind
创建一个新列,然后{{ 1}} rbind
元素
list