假设我有一个如下所示的嵌套列表
\ntest <- list(\n a = data.frame(x = 1),\n b = "foo",\n c = list(\n d = 1:5,\n e = data.frame(y = 1),\n f = "a",\n list(g = "hello")\n )\n)\ntest\n#> $a\n#> x\n#> 1 1\n#> \n#> $b\n#> [1] "foo"\n#> \n#> $c\n#> $c$d\n#> [1] 1 2 3 4 5\n#> \n#> $c$e\n#> y\n#> 1 1\n#> \n#> $c$f\n#> [1] "a"\n#> \n#> $c[[4]]\n#> $c[[4]]$g\n#> [1] "hello"\nRun Code Online (Sandbox Code Playgroud)\n我想知道这个嵌套列表中字符元素的位置。在这种情况下,我想返回一个命名向量或命名列表,其中TRUE元素是否为字符,FALSE否则返回。
我可以用 来做到这一点rapply,它会取消列出所有内容:
rapply(test, is.character)\n#> a.x b c.d c.e.y c.f c.g \n#> FALSE TRUE FALSE FALSE TRUE TRUE\nRun Code Online (Sandbox Code Playgroud)\n但是,我可以\xe2\x80\x99t 这样做来查找所有数据帧,因为rapply()也取消列出\n数据帧(请注意,第一个元素a.x不仅是a).
rapply(test, is.data.frame)\n#> a.x b c.d c.e.y c.f c.g \n#> FALSE FALSE FALSE FALSE FALSE FALSE\nRun Code Online (Sandbox Code Playgroud)\n因此,有没有办法找到嵌套列表中的哪些元素是数据帧?\n请注意,该解决方案应该适用于嵌套列表中的任意数量的级别。\n
\nI\xe2\x80\x99m 仅在基本 R 中寻找解决方案。
\n1)申请
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |