如何在不在 R 中添加索引的情况下获取(子)对象的名称?

How do i get the names of an (sub-)object without having indices added in 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),则删除数字) 被检测到。但好像 很好的解决方法。所以想问一下有没有更好的方法可以跟进

这个:

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

Returns:

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

可能有更好的方法,但这会得到输出:

lst <- rlist::list.flatten(lst)

unlist(
  unname(
    Map(
      function(x, y) sub('.*\.', '', rep(x, each = y)),
      names(lst),
      sapply(lst, length)
    )
  )
)

你的第二个例子:

 [1] "aa"  "x"   "b"   "b"   "b"   "c"   "c"   "c"   "d2"  "d2"  "d2"  "x21" "x21"
[14] "x21"

数据:

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