请考虑以下列表:
x <- list("a" = list("b", "c"),
"d" = list("e", "f" = list("g", "h")),
"i" = list("j", "k" = list("l" = list("m", "n" = list("o", "p")))))
值得注意的是:
- 并非所有名称和元素都是一个字符
- 有一个不确定的嵌套级别 * 先验 *。
给定x
,我的目标是输出 Dataframe :
y <- data.frame(
main_level = c(rep("a", 2), rep("d", 3), rep("i", 4)),
level1 = c("b", "c", "e", rep("f", 2), "j", rep("k", 3)),
level2 = c(NA, NA, NA, "g", "h", NA, "l", "l", "l"),
level3 = c(NA, NA, NA, NA, NA, NA, "m", "n", "n"),
level4 = c(NA, NA, NA, NA, NA, NA, NA, "o", "p")
)
> y
main_level level1 level2 level3 level4
1 a b <NA> <NA> <NA>
2 a c <NA> <NA> <NA>
3 d e <NA> <NA> <NA>
4 d f g <NA> <NA>
5 d f h <NA> <NA>
6 i j <NA> <NA> <NA>
7 i k l m <NA>
8 i k l n o
9 i k l n p
注意更正了上述y
中的一个排印错误。
上面的内容暗示了列的数量也是可变的,这取决于嵌套的深度。
我在网上找到的解决方案,当涉及到嵌套列表时,假设列表命名结构或多或少是一致的,当然这里不是这样;例如,How to convert a nested lists to dataframe in R?和Converting nested list to dataframe处的解决方案不适用,因为它们在命名上要一致得多。
3条答案
按热度按时间3pmvbmvn1#
这里有一个主要依靠
rrapply
的方法:输出
注意到目前为止它还很粗糙,可能有更好的方法来改变
rrapply
的输出,例如,row[grep("[A-Za-z]", row)]
可能不是每次都有效,我也没有测试length(newrow) <- purrr::vec_depth(x) - 1
是否是猜测长度的好方法,但它在这里有效。ma8fv8wu2#
下面是一个递归函数,除了你描述的结构外,它没有其他假设:
hiz5n14c3#
受Maël答案的启发,下面是一个使用
rrapply()
的稍微更健壮的方法:NA
NA
替换为其叶值(value
列)