次のリストがあると想像してください
_> 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番目の列に名前を付ける方法がわかりません。
これは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"
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"
予想される出力に基づいて
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