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

jra*_*ara 30 conditional r list

如何根据另一个列表中的条件(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]
Run Code Online (Sandbox Code Playgroud)

l [cond]出错:无效的下标类型'list'

Jas*_*gan 31

这就是Filter函数的用途:

Filter(function(x) length(x) > 3, l)
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
Run Code Online (Sandbox Code Playgroud)

  • 简单的。基地 R. 喜欢它! (2认同)

Pat*_*ckR 24

另一种方法是使用sapply而不是lapply.

cond <- sapply(l, function(x) length(x) > 3)
l[cond]
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 17

[期待一个矢量,所以使用unlistcond:

l[unlist(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 5

> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6
Run Code Online (Sandbox Code Playgroud)