在保留索引的同时绑定数据帧列表

时间:2019-01-12 09:28:20

标签: r dplyr

关于将数据帧列表转换为单个数据帧(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)))

2 个答案:

答案 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