web-dev-qa-db-ja.com

lapply()を使用してリストの各要素の名前を取得するにはどうすればよいですか?

次のリストがあると想像してください

_> 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 <- 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番目の列に名前を付ける方法がわかりません。

12
PAC

これは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"    
6
thie1e

testの両方の要素に3列の行列を含めるつもりであると想定すると、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"  
4
aaronwolen

予想される出力に基づいて

  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
2
akrun