列表列表,在R中转换为数据框

时间:2019-03-10 02:35:12

标签: r na nested-lists

我有类似这样的东西:

Group1 <- list(Date=c("a","b","c"), Name=c("a2","b2"), Age=c("a3","b3","c3","d3"))
Group2 <- list(Date=c("a","b","c"), Name=c("a2","b2","b3"), Age=c("a3","b3","c3","d3"))
Group3 <- list(Date=c("a","b","c"), Name=c("a2","b2"), Age=c("a3","b3"))
all <- list(Group1,Group2,Group3)
all

我需要添加NA,以便每个日期,名称和年龄列表的长度相等。然后,我需要将其转换为数据帧。

由于列表中有列表,因此我对如何添加NA感到困惑。我将有1000多个“组”,其中包含数据列表(日期,名称,年龄类别始终相同,因此长度不变)。在当前示例中,这些组中的最长列表应始终为4,因此,任何其他内容都应具有NA。我看过这样的代码,它很接近,但不适用于列表中的列表:

## Compute maximum length
max.length <- max(sapply(all, length))
## Add NA values to list elements
l <- lapply(all, function(v) { c(v, rep(NA, max.length-length(v)))})

我可以对当前数据集执行类似的操作吗?

2 个答案:

答案 0 :(得分:0)

我们可以尝试合并purrrplyr

plyr::ldply(purrr::map(all_list,unlist),function(x) rbind(x,NA))

输出:

 #    .id Date1 Date2 Date3 Name1 Name2 Age1 Age2 Age3 Age4 Name3
#1     1     a     b     c    a2    b2   a3   b3   c3   d3  <NA>
#2     1  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>
#3     2     a     b     c    a2    b2   a3   b3   c3   d3    b3
#4     2  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>
#5     3     a     b     c    a2    b2   a3   b3 <NA> <NA>  <NA>
#6     3  <NA>  <NA>  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA>  <NA>

答案 1 :(得分:0)

names(all) <- 1:length(all) #Will help us latter in bind_rows

将每个列表元素传输到有效数据框中

all_mod <- lapply(all,function(x){
           #browser()
           max.length<-max(sapply(x, length))
           data.frame(sapply(x, function(v) {c(v, rep(NA, max.length-length(v)))}), stringsAsFactors = FALSE)
           })

最后使用bind_rows将所有元素绑定在一起,并使用.id识别数据帧

library(dplyr)
bind_rows(all_mod, .id = 'ID')
相关问题