#> $c #> $c$d #> [1] 1 2 3 4 5 #> #>-6ren">
gpt4 book ai didi

r - 查找嵌套列表的哪些元素是数据框

转载 作者:行者123 更新时间:2023-12-05 01:49:16 24 4
gpt4 key购买 nike

假设我有一个如下所示的嵌套列表

test <- list(
a = data.frame(x = 1),
b = "foo",
c = list(
d = 1:5,
e = data.frame(y = 1),
f = "a",
list(g = "hello")
)
)
test
#> $a
#> x
#> 1 1
#>
#> $b
#> [1] "foo"
#>
#> $c
#> $c$d
#> [1] 1 2 3 4 5
#>
#> $c$e
#> y
#> 1 1
#>
#> $c$f
#> [1] "a"
#>
#> $c[[4]]
#> $c[[4]]$g
#> [1] "hello"

我想知道字符元素在这个嵌套列表中的位置。在这个情况下,如果元素是一个字符,否则为 FALSE

我可以使用 rapply 来做到这一点,它取消列出所有内容:

rapply(test, is.character)
#> a.x b c.d c.e.y c.f c.g
#> FALSE TRUE FALSE FALSE TRUE TRUE

但是,我无法找到所有数据帧,因为 rapply() 也会取消列出数据帧(请注意,第一个元素是 a.x 而不仅仅是 a)。

rapply(test, is.data.frame)
#> a.x b c.d c.e.y c.f c.g
#> FALSE FALSE FALSE FALSE FALSE FALSE

因此,有没有办法找到嵌套列表的哪些元素是数据框?请注意,该解决方案应该适用于嵌套中的任意数量的级别列表。

我正在寻找仅基于 R 的解决方案。

最佳答案

1) 申请

library(rrapply)

cls <- c("data.frame", "ANY")
rrapply(test, f = is.data.frame, classes = cls, how = "unlist")
## a b c.d c.e c.f c.g
## TRUE FALSE FALSE TRUE FALSE FALSE

2) 递归

findDF <- function(x) {
if (is.data.frame(x)) TRUE
else if (is.list(x)) lapply(x, findDF)
else FALSE
}

unlist(findDF(test))
## a b c.d c.e c.f c.g
## TRUE FALSE FALSE TRUE FALSE FALSE

关于r - 查找嵌套列表的哪些元素是数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74276459/

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