我需要将arbitrarily个嵌套列表展平到一个数据帧,并在一列中保留键/索引的路径,同时将底层的每个元素提取到一行.

考虑以下列表:

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或数据实现这一点.桌子.我需要一个递归函数,还是有现成的解决方案?谢谢!

EDIT: akrun提供的解决方案是基于原始数据的.我意识到,当一个元素在底层是NULL时,就会出现一个问题,因此我重新表述了这个问题.

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

推荐答案

这可以通过输入数据来实现.框,然后unite键列

library(reshape2)
library(dplyr)
library(tidyr)
out2 <- melt(lst) %>% 
        unite(path, L1:L3, sep = "_", na.rm = TRUE) %>% 
        select(path, value)

-判断OP的输出

> all.equal(out, out2)
[1] TRUE

我们也可以使用base R中的unliststack

stack(unlist(lapply(lst, \(x) if(is.null(x)) NA_character_ else x)))[2:1]

R相关问答推荐

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

单击 map 后,将坐标复制到剪贴板

将年度数据插入月度数据

用derrr在R中查找组间的重复项

通过使用str_detect对具有相似字符串的组进行分组

标识R中多个列中缺少的唯一值

如何改变x轴比例的列在面

使用范围和单个数字将数字与字符串进行比较

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

展开对数比例绘图的轴(添加填充)

从服务器在Shiny中一起渲染图标和文本

R-按最接近午夜的时间进行筛选

函数可以跨多个列搜索多个字符串并创建二进制输出变量

使用geom_iles在一个切片中包含多个值

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?

生存时间序列的逻辑检验

如何使用grepl()在数据帧列表中 Select 特定字符串?

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

如何系统地根据柱的位置对柱进行操作?