基于逻辑条件的列表中的子集元素

时间:2011-08-04 12:36:15

标签: list r conditional

如何根据另一个列表中的条件(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'

7 个答案:

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