如何根据另一个列表中的条件(TRUE,FALSE)对列表进行子集化?请看下面的例子:
l <- list(a=c(1,2,3), b=c(4,5,6,5), c=c(3,4,5,6))
l
$a
[1] 1 2 3
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
cond <- lapply(l, function(x) length(x) > 3)
cond
$a
[1] FALSE
$b
[1] TRUE
$c
[1] TRUE
> l[cond]
l [cond]中的错误:无效的下标类型'list'
答案 0 :(得分:23)
另一种方法是使用sapply
代替lapply
。
cond <- sapply(l, function(x) length(x) > 3)
l[cond]
答案 1 :(得分:23)
这是Filter
函数的用途:
Filter(function(x) length(x) > 3, l)
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
答案 2 :(得分:16)
[
期待一个向量,因此请在unlist
上使用cond
:
l[unlist(cond)]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
答案 3 :(得分:4)
> l[as.logical(cond)]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
答案 4 :(得分:0)
cond <- lapply(l, length) > 3
l[cond]
答案 5 :(得分:0)
我最近学会了lengths()
,它获取列表中每个元素的长度。这允许我们避免在OP尝试的情况下制作包含逻辑值的另一个列表。
lengths(l)
#a b c
#3 4 4
在逻辑条件下使用它,我们可以在l
。
l[lengths(l) > 3]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
答案 6 :(得分:0)
l <- list(a=c(1,2,3), b=c(4,5,6,5), c=c(3,4,5,6))
l[lengths(l) > 3]
$b
[1] 4 5 6 5
$c
[1] 3 4 5 6
如果需要 value 的条件:
cond <- lapply(l, function(i) i > 3)
res <- Map(`[`, l, cond)
res
$a
numeric(0)
$b
[1] 4 5 6 5
$c
[1] 4 5 6