我想基于其中一个子列表元素的内容对子列表进行子集化,方式类似于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
替换。
请注意,在所有情况下,子列表将具有相同的组件,只有组件的值更改。
答案 0 :(得分:3)
这将为您提供keepMe
位置中两个TRUE的列表:
myList[ unlist( sapply(myList, "[", "keepMe") ) ]
@ttmaccer解决方案省略i=
myList[ sapply(myList, "[[", "keepMe") ]
(这是成功的,因为sapply
会尝试传递一个向量或矩阵,但是“[”返回一个列表,而“[[”返回原子逻辑。)
答案 1 :(得分: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