gpt4 book ai didi

r - 从多级嵌套列表中提取信息

转载 作者:行者123 更新时间:2023-12-04 22:55:42 26 4
gpt4 key购买 nike

我在嵌套列表中有一组数据,这样顶部列表的每个成员都有描述符(但不一定是相同的描述符),然后是子项列表,这些子项可以有子项,依此类推。 child 的深度是任意的。一个最小的例子:

family <- list(
list(name = "Alice", age = 40, eyes = "blue", children = list(
list(name = "Bob", age = 20, eyes = "blue"),
list(name = "Charlie", age = 18, eyes = "brown")
)),
list(name = "Dan", age = 12, eyes = "green"),
list(name = "Erin", age = 69, eyes = "green", children = list(
list(name = "Frank", age = 45, eyes = "blue", children = list(
list(name = "George", age = 24, eyes = "blue", children = list(
list(name = "Harry", age = 2, eyes = "green")
)),

list(name = "Ingrid", age = 22, eyes = "brown", hair = "brown"),
list(name = "Jack", age = 29, eyes = "brown")
)),
list(name = "Karen", age = 43),
list(name = "Larry", age = 21, eyes = "blue")
))
)

> str(family, max.level = 2)
List of 3
$ :List of 4
..$ name : chr "Alice"
..$ age : num 40
..$ eyes : chr "blue"
..$ children:List of 2
$ :List of 3
..$ name: chr "Dan"
..$ age : num 12
..$ eyes: chr "green"
$ :List of 4
..$ name : chr "Erin"
..$ age : num 69
..$ eyes : chr "green"
..$ children:List of 3

理想情况下,我想创建一个数据框,这样每一行都是一个家庭成员,每一列都是列表中的一个属性:
      name       age      eyes
1 Alice 40 blue
2 Bob 20 blue
3 Charlie 18 brown
(etc)

但是不清楚如何递归地做到任意深度。我设法使用 map(family, ~ .$name) 获得了顶级成员,但我不明白如何更深入。有些成员没有 child ,这让事情变得复杂。

我已经查看了 purrr 文档,但我找不到任何似乎有帮助的内容。也许我没有使用正确的术语。

建议表示赞赏。谢谢!

最佳答案

您始终可以递归地遍历列表并收集信息。除了map_dfr来自 purrr我的解决方案使用 defaults来自 plyr处理缺少眼睛或头发颜色的情况。

get_people <- function(x) {
if (is.null(x)) return(NULL)
if (!is.null(x$name)) { # if there's a name, we're at the level of a person
children <- x$children
x$children <- NULL
row <- data.frame(plyr::defaults(x, list(age = NA, eyes = NA, hair = NA)),
stringsAsFactors = FALSE)
rbind(row, get_people(children))
}
else {
purrr::map_dfr(x, get_people)
}
}

当您将此应用于您的列表时:
> get_people(family)
name age eyes hair
1 Alice 40 blue <NA>
2 Bob 20 blue <NA>
3 Charlie 18 brown <NA>
4 Dan 12 green <NA>
5 Erin 69 green <NA>
6 Frank 45 blue <NA>
7 George 24 blue <NA>
8 Harry 2 green <NA>
9 Ingrid 22 brown brown
10 Jack 29 brown <NA>
11 Karen 43 <NA> <NA>
12 Larry 21 blue <NA>

关于r - 从多级嵌套列表中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com