从R列表元素中提取名称,但忽略数据框列名

4

期望

拥有一个 R 函数。

listNames = function(l) {
   # return list element names
}

返回所有列表元素的函数,但忽略数据框第一级的列名。
listNames(a)
[1] "b.df1" "b.e" "c" "df2"  

从嵌套列表中:

a = list(b = list(df1 = data.frame(col = c(1,2)), e = NULL), c = NULL, df2 = data.frame(c12 = c(1,2),c34 = c(3,4)))

目前为止的尝试

unlist 函数也会返回数据框中的列。我想这是因为数据框也被认为是列表。

names(unlist(a,recursive = FALSE))
[1] "b.df1"   "b.e"     "df2.c12" "df2.c34"

names(a) 跳过了嵌套元素。

names(a)
[1] "b"   "c"   "df2"

1
你在寻找 names(a) 吗? - Martin Gal
@MartinGal 不是,看编辑 - sequoia
2个回答

3
你可以编写一个递归函数,当列表或data.frame不存在时停止。
listNames = function(l) {
  if(!is.list(l) | is.data.frame(l)) TRUE
  else (lapply(l, listNames))
}

names(unlist(listNames(a)))
#[1] "b.df1" "b.e"   "c"     "df2"

2
使用外部包可以使用rrapply::rrapply()完成此操作,它扩展了基本的rapply以避免递归到各个data.frame列中。
一种可能的方法是在评估的classes中包括"data.frame"并返回每个评估元素的名称,这对于任意层次的嵌套都有效。
library(rrapply)

rrapply(a, classes = c("ANY", "data.frame"), f = function(x, .xname) .xname, how = "unlist")

#> b.df1   b.e     c   df2 
#> "df1"   "e"   "c" "df2"

嗨Joris,看起来不错,尽管我们尝试避免依赖关系,但我很欣赏一行代码! - sequoia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接