从 data.frames 的嵌套列表中提取列名

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)

jaz*_*rro 7

已经有几个答案了。但让我留下另一种方法。我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)


Tho*_*ing 6

这是一个基本的 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)