我有一些看起来像这样的东西:
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)))})
我能为我当前的数据集做些类似的事吗?
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')
我们可以尝试结合purrr
和plyr
:
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>