首页 > 解决方案 > R函数将不同长度的嵌套列表转换为数据框

问题描述

我有一个包含 10000 个嵌套列表的列表,其中包含两个组件(“x”和“y”)。例如

iter1 <- list(x = c(8500, 8510, 8520, 8530), y = c(1.2, 1.3, 1.4, 1.5))
iter2 <- list(x = c(8490, 8500, 8510, 8520, 8530), y = c(1.2, 1.2, 1.3, 1.4, 1.5))
iter3 <- list(x = c(8510, 8520, 8530, 8540, 8550, 8560), y = c(1.2, 1.2, 1.3, 1.4, 1.5, 1.6))
All <- list(iter1 = iter1, iter2 = iter2, iter3 = iter3)

我想创建一个数据框并从每个数据框转换 y 组件并将它们转换为与匹配的 x 值相对应的列,以给出如下所示的内容。

    #      iter1 iter2 iter3
    # 8490    NA   1.2    NA
    # 8500   1.2   1.2    NA
    # 8510   1.3   1.3   1.2
    # 8520   1.4   1.4   1.2
    # 8530   1.5   1.5   1.3
    # 8540    NA    NA   1.4
    # 8550    NA    NA   1.5
    # 8560    NA    NA   1.6

我尝试了很多方法,但到目前为止都失败了。有没有有效的方法来做到这一点?

非常感谢,格雷厄姆

标签: rnested-lists

解决方案


list您可以为每个输入创建一个 2 列数据框All并加入它们。

library(dplyr)
library(purrr)

map(All, bind_rows) %>% 
    reduce(full_join, by = 'x') %>% 
    arrange(x) %>%
    rename_with(~names(All), -1)

# A tibble: 8 x 4
#      x iter1 iter2 iter3
#  <dbl> <dbl> <dbl> <dbl>
#1  8490  NA     1.2  NA  
#2  8500   1.2   1.2  NA  
#3  8510   1.3   1.3   1.2
#4  8520   1.4   1.4   1.2
#5  8530   1.5   1.5   1.3
#6  8540  NA    NA     1.4
#7  8550  NA    NA     1.5
#8  8560  NA    NA     1.6

基础 R 中的相同操作可以如下所示:

Reduce(function(x, y) merge(x, y, all = TRUE, by = 'x'), 
       lapply(All, function(x) do.call(cbind.data.frame, x)))

推荐阅读