r - 展平嵌套列表并保留每个底层元素的所有父键

标签 r recursion nested-lists flatten

我需要将任意嵌套列表展平为数据框,并将键/索引的路径保留在一列中,同时将底层的每个元素提取到单独的行。

考虑以下列表:

lst <- list(
    animals = list(
        lamas = c("brown", "white"),
        primates = list(
            humans = c("asia", "europe"),
            apes = c("good", "fast", "angry")
        )
    ),
    objects = c("expensive", "cheap"),
    plants = NULL
)

flatten_list(lst, delimiter="_") 的结果应如下所示:

data.frame(
  path = c("animals_lamas", "animals_lamas", "animals_primates_humans", "animals_primates_humans", "animals_primates_apes", "animals_primates_apes", "animals_primates_apes", "objects", "objects", "plants"),
  value = c("brown", "white", "asia", "europe", "good", "fast", "angry", "expensive", "cheap", NA)
)

令我惊讶的是我无法使用 tidyr 或 data.tables 实现这一目标。我是否需要递归函数,或者是否有一些现成的解决方案?赞赏!

编辑:akrun提供的解决方案对原始数据进行了研究。我意识到当底层元素为 NULL 时会出现问题,因此重新表述了该问题。

EDIT2 我当前的解决方法是在应用 akrun 之前将 NULL 递归替换为 NA解决方案,使用函数 supplied here [再次由 akrun ;)].

最佳答案

基于rrapply的可以处理NULL的解决方案:

library(tidyverse)
library(rrapply)

rrapply(lst, f = \(x) if (is.null(x)) NA else x, how = "melt") %>% 
  unnest(value) %>% unite(path, L1:L3, na.rm = T)

#> # A tibble: 10 × 2
#>    path                    value    
#>    <chr>                   <chr>    
#>  1 animals_lamas           brown    
#>  2 animals_lamas           white    
#>  3 animals_primates_humans asia     
#>  4 animals_primates_humans europe   
#>  5 animals_primates_apes   good     
#>  6 animals_primates_apes   fast     
#>  7 animals_primates_apes   angry    
#>  8 objects                 expensive
#>  9 objects                 cheap    
#> 10 plants                  <NA>

关于r - 展平嵌套列表并保留每个底层元素的所有父键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72235642/

相关文章:

java - 糟糕的动态编程实现或 HashMap 慢?

javascript - javascript 中的递归函数、setTimeout 和 'this' 关键字

python - 如何将嵌套列表的字符串转换回嵌套列表?

r - R 中的 allocate() 和 <<- 有什么区别?

r - 订购 1 :17 by perfect square pairs

R:返回矩阵中最大的连续数字对

c - 使用递归反转字符串

r - R 中按天的观察次数

php - 如何在不突出显示子列表项的情况下突出显示父列表项?

python - 修改嵌套列表元素的最优雅方式