我需要将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相关问答推荐

在 tibble R 的截止范围内随机采样

使用 reduce2 和 rlang 改变列

统计模式的空数据变化功能

R 当前时间(以毫秒为单位)

如何为r中的每个ID创建一个新列,其中包含第一个日期的年份

使用 R 解密 PHP 中加密的消息

反复计算

在向量中的下一个较高值之前查找值的数量

如何仅在 R 管道 dplyr 中插入包含上述几行总和的数据帧的特定索引中的行

如何在ggplot中将连续的x轴更改为离散的x轴?

sf 数据框中几何或坐标的“地板”空间类似功能

模型未能在 r (lme4) 中收敛或不收敛

更改输入值时不要清除(用户输入的)react 变量的值

从基本 R 图转换为 ggplot

使用mutate_all和cross时如何在case_when中添加列名?

如何在 r 中建立不对称相关性?

提取向量中某个符号最后一次出现后的字符

计算R中几个分类变量的频率

通过(非统一)名称连接两个数据集

如何在 R 中设置错误消息的宽度?