【问题标题】:Derive names of R list elements, but ignore data.frame column names派生 R 列表元素的名称,但忽略 data.frame 列名称
【发布时间】:2021-07-20 10:48:06
【问题描述】:

想要的

具有 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 还返回 data.frame 列。我假设是因为 data.frames 也被视为列表

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

names(a) 跳过嵌套元素

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

【问题讨论】:

  • 您在寻找names(a)吗?
  • @MartinGal 不,见编辑

标签: r list dataframe


【解决方案1】:

你可以写一个递归函数在没有列表或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,看起来不错,尽管我们试图避免依赖关系,但我总是很欣赏单线!
    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2015-12-22
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多