首页 > 解决方案 > 如何在没有在 R 中添加索引的情况下获取(子)对象的名称?

问题描述

我想获取一个(子)对象的名称(因此所有生成的对象之后unlist),而不在 R 中添加索引。

(简化)样本数据:(更复杂的数据见文末备注)。

lst <- list(
  a = data.frame(b = 1, c = c(1, 2, 3), "d2" = 5, "x21" = 3)
)

预期输出:

c("b", "b", "b", "c", "c", "c", "d2", "d2", "d2", "x21", "x21", "x21")

电流输出:

  > unlist(lst) %>% names
[1] "aa"       "b.x"      "b.a.b1"   "b.a.b2"   "b.a.b3"   "b.a.c1"   "b.a.c2"   "b.a.c3"   "b.a.d21"  "b.a.d22"  "b.a.d23"  "b.a.x211" "b.a.x212"
[14] "b.a.x213"

我尝试了什么:

lapply(lst, names)

越来越近。但请注意,这是简化数据,目标 data.frame 可以嵌套在 3+ 个父列表中。

lst <- list(
  list(aa = 1,
       b = list(x = 2, 
                a = data.frame(b = 1, c = c(1, 2, 3), "d2" = 5, "x21" = 3)
       )
  )
)

我想开始按点拆分,然后检查模式的结果值 (b1, b2, b3) 或 (d21, d22, d23),如果检测到像 (1-10) 这样的清晰模式,则删除数字。但这似乎是一种解决方法。所以我想问是否有更好的方法可以遵循。

标签: rnames

解决方案


这:

lapply(lst, function(x) rep(names(x), each=nrow(x)))

回报:

$a
[1] "b"   "b"   "b"   "c"   "c"   "c"   "d2"  "d2"  "d2"  "x21" "x21" "x21"

推荐阅读