【问题标题】:R efficient way to convert named/nested list to data frameR将命名/嵌套列表转换为数据框的有效方法
【发布时间】:2020-04-05 17:58:16
【问题描述】:

我正在尝试将命名和嵌套列表转换为数据框(仅供参考,该列表是 st_nn 函数的产物,其中 nn 代表最近邻,d 代表距离)。下面是一个可重现的例子。

nn <- list(c(1,2), c(2,3))
d <- list(c(0, 100), c(11,43))
l <- list(nn, d)

df 是我想要的。

df <- data.frame(nn1 = c(1,2),
                nn2 = c(2,3),
                d1 = c(0, 11),
                d2 = c(100, 43))

下面的代码以某种特别的方式完成了这项工作,但我很好奇是否有更优雅的方法(最好是tidyverse 方法)。

df2 <- data.frame(rbindlist(l) %>% t()) %>% rename(nn1 = X1, nn2 = X2, d1 = X3, d2 = X4)

【问题讨论】:

    标签: r data.table tidyverse


    【解决方案1】:

    我们可以遍历listrbind内部列表元素和cbind外部list

    out <-  do.call(cbind.data.frame, lapply(l, function(x) do.call(rbind, x)))
    names(out) <- c('nn1', 'nn2', 'd1', 'd2')
    out
    #  nn1 nn2 d1  d2
    #1   1   2  0 100
    #2   2   3 11  43
    

    或者mapunnest_wider

    library(dplyr)
    library(purrr)
    library(tidyr)
    map_dfc(l, ~ transpose(.x) %>%
                     map_dfc(~ tibble(col1 = .x) %>%
                               unnest(c(col1)))) %>%
           set_names(c('nn1', 'nn2', 'd1', 'd2'))
    # A tibble: 2 x 4
    #    nn1   nn2    d1    d2
    #* <dbl> <dbl> <dbl> <dbl>
    #1     1     2     0   100
    #2     2     3    11    43
    

    【讨论】:

    • 看起来 op 想要列 d1c(0, 11) 和列 d2c(11, 43)
    • @akrun 感谢您的回答!我仔细检查了我的问题,在我看来,d1c(0,11)d2c(100,43)。如果我的帖子自相矛盾,请纠正我。
    • @qnp1521 你检查了我的第二个答案吗?我保留了第一个答案,因为我认为这可能是一个错字
    • @akrun 谢谢!是的,第二个效果很好。此外,第一个与一个修复程序(rbind 而不是cbind 内的lapply)一起工作得很好。我更喜欢第一种方法,因为它会自动创建更有用的列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多