【问题标题】:Lists of Lists, Convert to Data Frame in R列表列表,在 R 中转换为数据框
【发布时间】:2019-03-10 02:35:11
【问题描述】:

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

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


【解决方案1】:
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')

【讨论】:

    【解决方案2】:

    我们可以尝试结合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>
    

    【讨论】:

    • 我稍后会重新讨论。如果您发现改进方法,请在此处发表评论。
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多