75

lapply 関数内のリスト名にアクセスする必要があります。関数内の各リスト要素名を取得できるようにするには、リストの名前を反復処理する必要があると言われているオンラインのスレッドをいくつか見つけました。

> n = names(mylist)
> mynewlist = lapply(n, function(nameindex, mylist) { return(mylist[[nameindex]]) }, mylist)
> names(mynewlist)
NULL
> names(mynewlist) = n

問題は、mynewlist が元の mylist インデックスを失い、それらを復元するためにその last names() 割り当てを追加する必要があることです。

lapply 関数によって返される各要素に明示的なインデックス名を付ける方法はありますか? または、mynewlist 要素に正しいインデックス名が設定されていることを確認する別の方法はありますか? lapply がリスト要素を mylist と同じ順序で返さない場合、mynewlist のインデックス名が間違っている可能性があると思います。

4

6 に答える 6

76

lapplyデフォルトでは、繰り返しているものの名​​前属性を保持していると思います。myListの名前をinに保存するとn、そのベクトルには「名前」がなくなります。それを via に追加すると、

names(n) <- names(myList)

以前と同じように使用するとlapply、目的の結果が得られるはずです。

編集

今朝は頭が少し曇っています。別の、おそらくより便利なオプションを次に示します。

sapply(n,FUN = ...,simplify = FALSE,USE.NAMES = TRUE)

私は手探りしていて、議論lapplyがないことに混乱していましたが、実際にコードを見て、自分がばかげていることに気づきました。これはおそらくより良い方法でした。USE.NAMESsapply

于 2012-02-27T18:12:18.233 に答える
46

setNames関数はここで便利なショートカットです

mylist <- list(a = TRUE, foo = LETTERS[1:3], baz = 1:5)
n <- names(mylist)
mynewlist <- lapply(setNames(n, n), function(nameindex) {mylist[[nameindex]]})

名前を保持する

> mynewlist
$a
[1] TRUE

$foo
[1] "A" "B" "C"

$baz
[1] 1 2 3 4 5
于 2013-08-29T20:31:03.207 に答える
7

ジョランの答えに基づいて構築し、それを正確にします:

ラッパーは実際に、sapply(USE.NAMES=T)繰り返し処理しているベクトルの値を最終結果の名前として設定します (lapply のような名前属性ではありません)が、これらが文字である場合に限ります。

その結果、インデックスを渡すことは役に立ちません。でインデックスを渡したい場合はsapply、(醜い) キャストに頼る必要があります。

sapply(as.character(c(1,11)), function(i) TEST[[as.numeric(i)]], USE.NAMES = TRUE)

この場合、よりクリーンな解決策は、元のオブジェクトの名前を直接設定して使用することです。ソリューションの完全なリストは次のとおりです。

TEST <- as.list(LETTERS[1:12])

### lapply ##
## Not working because no name attribute
lapply(c(1,11), function(i) TEST[[i]])

## working but cumbersome
index <- c(1,11)
names(index) <- index
lapply(index, function(i) TEST[[i]])

### sapply ##
## Not working because vector elements are not strings
sapply(c(1,11), function(i) TEST[[i]], simplify = F) 

## Working with the casting trick
sapply(as.character(c(1,11)), function(i) TEST[[as.numeric(i)]], simplify = F)

## Cleaner, using names with sapply:
names(TEST) <- LETTERS[26:15] 
sapply(names(TEST)[c(1,11)], function(name) TEST[[name]], simplify = F) 
于 2013-08-29T17:58:22.807 に答える
6

llply()パッケージから覗きましたplyrか?

それはまさにあなたが求めていることをします。リストの各要素に対して関数を適用し、結果をリストとして保持します。llply は、ラベルを保持し、進行状況バーを表示できることを除いて、lapply と同等です。から?llply

mylist <- list(foo1=1:10,foo2=11:20)
>names(mylist)
[1] "foo1" "foo2"
newlist<- llply(mylist, function(x) mean(x))

>names(newlist)
[1] "foo1" "foo2"
于 2012-02-28T01:06:38.857 に答える