2

我想根据子列表元素之一的内容对子列表列表进行子集化,其方式类似于subset处理数据帧的方式:

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 的列表:

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 回答