use*_*111 12 nested r dataframe
我有一个嵌套的 data.frames 列表,获取所有 data.frames 的列名的最简单方法是什么?
例子:
d = data.frame(a = 1:3, b = 1:3, c = 1:3)
l = list(a = d, list(b = d, c = d))
Run Code Online (Sandbox Code Playgroud)
结果:
$a
[1] "a" "b" "c"
$b
[1] "a" "b" "c"
$c
[1] "a" "b" "c"
Run Code Online (Sandbox Code Playgroud)
已经有几个答案了。但让我留下另一种方法。我rapply2()
在rawr包中使用。
devtools::install_github('raredd/rawr')
library(rawr)
library(purrr)
rapply2(l = l, FUN = colnames) %>%
flatten
$a
[1] "a" "b" "c"
$b
[1] "a" "b" "c"
$c
[1] "a" "b" "c"
Run Code Online (Sandbox Code Playgroud)
这是一个基本的 R 解决方案。
您可以定义一个自定义函数来展平您的嵌套列表(它可以处理任何深度的嵌套列表,例如,超过 2 个级别),即,
flatten <- function(x){
islist <- sapply(x, class) %in% "list"
r <- c(x[!islist], unlist(x[islist],recursive = F))
if(!sum(islist))return(r)
flatten(r)
}
Run Code Online (Sandbox Code Playgroud)
然后使用下面的代码来实现colnames
out <- Map(colnames,flatten(l))
Run Code Online (Sandbox Code Playgroud)
以至于
> out
$a
[1] "a" "b" "c"
$b
[1] "a" "b" "c"
$c
[1] "a" "b" "c"
Run Code Online (Sandbox Code Playgroud)
具有更深嵌套列表的示例
l <- list(a = d, list(b = d, list(c = list(e = list(f= list(g = d))))))
> l
$a
a b c
1 1 1 1
2 2 2 2
3 3 3 3
[[2]]
[[2]]$b
a b c
1 1 1 1
2 2 2 2
3 3 3 3
[[2]][[2]]
[[2]][[2]]$c
[[2]][[2]]$c$e
[[2]][[2]]$c$e$f
[[2]][[2]]$c$e$f$g
a b c
1 1 1 1
2 2 2 2
3 3 3 3
Run Code Online (Sandbox Code Playgroud)
你会得到
> out
$a
[1] "a" "b" "c"
$b
[1] "a" "b" "c"
$c.e.f.g
[1] "a" "b" "c"
Run Code Online (Sandbox Code Playgroud)