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

Posted

技术标签:

【中文标题】基于逻辑条件的列表中的子集元素【英文标题】:Subset elements in a list based on a logical condition 【发布时间】:2011-10-19 23:14:48 【问题描述】:

如何根据另一个列表中的条件(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] 中的错误:无效的下标类型“列表”

【问题讨论】:

【参考方案1】:

这就是 Filter 函数的用途:

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

$c
[1] 3 4 5 6

【讨论】:

简单。 Base R. 喜欢它! Filter 的缺点是不能用于作业,这与 James 和 PatrickR 的答案相反。【参考方案2】:

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

cond <- sapply(l, function(x) length(x) > 3)
l[cond]

【讨论】:

这只会产生对象 cond,即子集的结果。 澄清一下,l[cond] 现在生成子集,因为 sapply 返回一个向量。编辑添加这个。【参考方案3】:

[ 需要一个向量,所以在cond 上使用unlist

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

$c
[1] 3 4 5 6

【讨论】:

【参考方案4】:
> l[as.logical(cond)]
$b
[1] 4 5 6 5

$c
[1] 3 4 5 6

【讨论】:

【参考方案5】:

我最近学习了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】:
cond <- lapply(l, length) > 3
l[cond]

【讨论】:

【参考方案7】:
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

如果需要的条件:

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

【讨论】:

【参考方案8】:

嗯,我对 R 很陌生,但由于它是一种功能语言,到目前为止,根据之前的答案,最好的解决方案是:

filter <- function (inputList, selector) sapply(inputList, function (element) selector(element))

假设您有一个像您这样的复杂列表:

myList <- list(
    a=c(1,2,3), 
    b=c(4,5,6,5), 
    c=c(3,4,5,6))

然后你可以过滤像这样的元素:

selection <- myList[filter(myList, function (element) length(element) > 3]

当然,这也适用于仅包含第一级值的列表:

anotherList <- list(1, 2, 3, 4)
selection <- myList[filter(anotherList, function (element) element == 2)]

或者你可以把它们放在一起:

filter <- function (inputList, selector) inputList[sapply(inputList, function (element) selector(element))]

【讨论】:

以上是关于基于逻辑条件的列表中的子集元素的主要内容,如果未能解决你的问题,请参考以下文章

检查元组列表中的所有第一个元素是不是满足条件

基于分组数据帧中的两个条件的子集

R - 子集列表data.frames由矢量值

python基于组合逻辑判断替换numpy数组中的满足条件的元素相等判断替换numpy数组中的指定数值为另一个数值大小判断替换numpy数组中大于指定阈值的数值为另一个值

R语言学习:提取R对象的子集

如何仅为列表中的项目子集提供披露按钮?