列表列表,转换为R中的数据框架

问题描述 投票:0回答:2

我有一些看起来像这样的东西:

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。我将有超过1,000个“组”,其中包含数据列表(总是相同的日期,名称,年龄类别,因此此长度不会更改)。对于当前示例,这些组中最长的列表应始终为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)))})

我能为我当前的数据集做些类似的事吗?

r na nested-lists
2个回答
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')

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>
© www.soinside.com 2019 - 2024. All rights reserved.