2

subsetデータフレームで機能するのと同様の方法で、サブリスト要素の1つの内容に基づいて、サブリストのリストをサブセット化したいと思います。

sublist1 <- list(data=rnorm(10), name="name1", keepMe=2)
sublist2 <- list(data=rnorm(10), name="name2", keepMe=2)
sublist3 <- list(data=rnorm(10), name="name3", keepMe=3)
myList <- list(s1=sublist1, s2=sublist2, s3=sublist3)

keepers <- subset[myList, keepMe==2]長さ2のリストを返すようなことをしたいと思います。

以下は私が欲しいものです:

require(plyr)
selector <- function(x) {
  if (x$keepMe==2) {return(x)} 
  else {return(NULL)}
}
keepers <- llply(myList, selector)

ただし、その場合、望ましくないリスト要素は破棄されず、。に置き換えられるだけですNULL

すべての場合において、サブリストは同じコンポーネントを持ち、コンポーネントの値のみが変更されることに注意してください。

4

2 に答える 2

3

keepMeこれにより、位置が TRUE の 2 つのリストが得られます。

myList[ unlist( sapply(myList, "[", "keepMe") ) ]

を省略した@ttmaccerソリューションi=

myList[ sapply(myList, "[[", "keepMe")  ]

(可能であればベクトルまたは行列を配信しようとするため、これは成功sapplyしますが、「[」はリストを返し、「[[」はアトミック論理を返します。)

于 2012-08-22T18:24:39.747 に答える
2

これは機能しますが、より直接的な方法があるかどうかはわかりません:

keepers = myList[-(which(sapply(1:length(myList), 
                                function(x) myList[[x]]$keepMe == FALSE)))]

str()結果のリストは次のとおりです。

str(keepers)
# List of 2
# $ s1:List of 3
#  ..$ data  : num [1:10] -0.82 0.487 0.738 0.576 -0.305 ...
#  ..$ name  : chr "name1"
#  ..$ keepMe: logi TRUE
# $ s2:List of 3
#  ..$ data  : num [1:10] -0.0449 -0.0162 0.9438 0.8212 0.5939 ...
#  ..$ name  : chr "name2"
#  ..$ keepMe: logi TRUE
于 2012-08-22T18:17:18.120 に答える