【问题标题】:How to rbind data.frames across third level of named lists?如何跨第三级命名列表 rbind data.frames?
【发布时间】:2020-07-02 11:59:34
【问题描述】:

第 1 级的列表“l_start”是一个命名列表,它本身在第 2 级嵌套命名列表(“l1”,“l1a”), 在第 3 层依次包含 2-3 个数据帧(a、b 和可能的 c)。

目标是根据名称在级别 3 重新绑定数据帧(如果可用)以获得“l_finish” (首选 data.table 和 rlist 解决方案,但 purrr 或 base 也可以)

# Level 2
l1 <- 
  # Level 3
  list(a = data.frame(matrix(1:4, ncol=2)),
       b = data.frame(matrix(1:4, ncol=2)),
       c= data.frame(matrix(1:4, ncol=2)))

# Level 2
l1a <- 
  # Level 3
  list(a = data.frame(matrix(1:6, ncol=2)),
       b = data.frame(matrix(1:6, ncol=2)))


# Level 1 "l_start"
l_start <- 
  list(l1, l1a)
names(l_start) <- c("l1", "l1a")

“l_finish”的外观

l_finish <- 
  list(l1_1a = list(a = rbind(l1$a, l1a$a),
                 b = rbind(l1$b, l1a$b)))

希望最终产品“l_finish” 请注意,c 已被删除,因为不在两个列表中

l_finish
#> $l1_1a
#> $l1_1a$a
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6
#> 
#> $l1_1a$b
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6

关闭,但无法完全到达那里

Rbind 发生在我的示例之上一级 rbind dataframes across nested lists

列表中只有一个 df 名称,而不是多个 rbind data.frames in a list in R

【问题讨论】:

    标签: r data.table bind nested-lists


    【解决方案1】:

    purrr 解决方案:

    library(purrr)
    cols <- intersect(names(l_start[[1]]), names(l_start[[2]]))
    
    map(l_start, `[`, cols) %>% transpose() %>% map(bind_rows)
    
    #$a
    #  X1 X2
    #1  1  3
    #2  2  4
    #3  1  4
    #4  2  5
    #5  3  6
    
    #$b
    #  X1 X2
    #1  1  3
    #2  2  4
    #3  1  4
    #4  2  5
    #5  3  6
    

    我们使用intersecttranspose 在列表中选择常用名称并绑定行。

    【讨论】:

    • 非常感谢,这确实回答了我原来的问题。不过我犯了一个错误,我在第 2 级有多个列表,每个列表都包含不同的 data.frame。 list(l1, l1a, l2, l2a) 转换为 list(l1_1a, l2_l2a)。您是否能够修改您的答案以允许此多个 2 级列表?很抱歉在第一次尝试时没有做好。
    • @DavidLucey 嗯...我不确定我是否理解。您能否发布一个实际列表结构的示例并显示相同的预期输出?
    • 我找到了另一种方法,但你回答了我提出的问题,所以接受了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多