使用lapply()如何获取列表中每个元素的名称?

14

想象一下我有以下列表:

> test <- list("a" = 1, "b" = 2)

列表中的每个元素都有一个名称:

> names(test)

现在,我想使用lapply()来提取该名称,因为我想将其用于新函数中,该函数将使用lapply调用。 我只是不知道如何提取每个元素的名称。

我尝试过使用deparse()substitute(),但结果很奇怪:

> lapply(test, function(x) {deparse(substitute(x))})
$a
[1] "X[[i]]"

$b
[1] "X[[i]]"

有人知道吗?

精度:

我想做这样一件事情: 我有一个名为test的列表:

> test <- list("a" = matrix(1, ncol = 3), "b" = matrix(2, ncol = 3))

我想对该列表应用一个函数,将每个元素中的数据进行转换,并为每列指定一个特定的名称:
make_df <- function(x) {
  output <- data.frame(x)
  names(output) <- c("items", "type", NAME_OF_X)
  return(output)
}
lapply(test, make_df)

期望的输出为:
> test
$a
     [,1] [,2] [,3]
[1,]    1    1    1
attr(,"names")
[1] "index" "type"  "a"    

$b
     [,1] [,2] [,3]
[1,]    2    2    2
attr(,"names")
[1] "index" "type"  "b"    

我不知道如何获取元素的名称,以便为我的第三列命名。


3
可以尝试使用lapply(names(test), function(x) test[[x]])来循环遍历。使用names循环遍历时,你可以同时获得键和值的选项。 - akrun
2
返回测试的名称:lapply(seq_along(test),function(i)names(test [i])) - Julien Navarre
好的,第二个方法可行,但我想要一个适用于列表的方法,而不是 seq_along() - PAC
2
@PAC 我展示了获取值的方法,但如果你只需要键,则可以使用 lapply(names(test), function(x) x) - akrun
1
你想要获取列表元素的名称,而链接看起来与你想要的重复了。 - akrun
显示剩余8条评论
3个回答

9
这里有一个使用purrr的解决方案。它似乎比aaronwolden的解决方案运行得更快,但比akrun的解决方案慢(如果这很重要):
library(purrr)
map2(test, names(test), function(vec, name) {
    names(vec) <- c("index", "type", name)
    return(vec)
})

$a
     [,1] [,2] [,3]
[1,]    1    1    1
attr(,"names")
[1] "index" "type"  "a"    

$b
     [,1] [,2] [,3]
[1,]    2    2    2
attr(,"names")
[1] "index" "type"  "b"    

7

假设您的意思是希望test中的两个元素都包含一个三列矩阵,您可以使用mapply()函数,并分别提供列表和列表名称:

  test <- list("a" = matrix(1, ncol = 3), "b" = matrix(2, ncol = 3))

  make_df <- function(x, y) {
    output <- data.frame(x)
    names(output) <- c("items", "type", y)
    return(output)
  }

  mapply(make_df, x = test, y = names(test), SIMPLIFY = FALSE)

将产生:

## $a
##   items type a
## 1     1    1 1
##
## $b
##   items type b
## 1     2    2 2

更新

为了达到你在更新的问题中描述的预期输出:

test.names <- lapply(names(test), function(x) c("index", "type", x))
Map(setNames, test, test.names)

生成:

## $a
##      [,1] [,2] [,3]
## [1,]    1    1    1
## attr(,"names")
## [1] "a"     "index" "type"  
## 
## $b
##      [,1] [,2] [,3]
## [1,]    2    2    2
## attr(,"names")
## [1] "b"     "index" "type"  

3

根据展示的预期输出

  make_attr_names <- function(x){
   x1 <- test[[x]]
   attr(x1, 'names') <- c('items','type', x)
   x1}
lapply(names(test), make_attr_names)  
 #[[1]]
 #    [,1] [,2] [,3]
 #[1,]    1    1    1
 #attr(,"names")
 #[1] "items" "type"  "a"    

 #[[2]]
 #    [,1] [,2] [,3]
 #[1,]    2    2    2
 #attr(,"names")
 #[1] "items" "type"  "b"  

根据描述进行操作。
 make_df <- function(x){
       setNames(as.data.frame(test[[x]]), c('items', 'type', x))}
 lapply(names(test), make_df)
 #[[1]]
 # items type a
 #1     1    1 1

 #[[2]]
 #  items type b
 #1     2    2 2

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