通过评估元素来减少列表列表

时间:2017-09-08 12:34:43

标签: r

如何将列表列表减少为仅包含符合特定条件的值?我看到了类似的问题,并查看了FilterReduce等,但似乎无法发挥作用。

> h = list(A=c(1, 2, 3), B=c(2, 3, 4), C=c(0, 1, 2))
> h
$A
[1] 1 2 3

$B
[1] 2 3 4

$C
[1] 0 1 2 

期望的输出:

> MagicFunction(h, element >= 3)
$A
[1] 3

$B
[1] 3 4

2 个答案:

答案 0 :(得分:5)

你可以尝试,

Filter(length, lapply(h, function(i)i[i>=3]))

#$A
#[1] 3

#$B
#[1] 3 4

如果您的元素包含NA,那么您可以使用na.omit删除这些元素,.i.e

h = list(A=c(1, 2, 3), B=c(2, 3, 4), C=c(0, 1, 2), D=NA)
Filter(length, lapply(h, function(i)na.omit(i[i>=3])))

#$A
#[1] 3

#$B
#[1] 3 4

另一种选择是,

h = list(A=c(1, 2, 3), B=c(2, 3, 4), C=c(0, 1, 2), D=c(NA, 7))
Filter(length, lapply(h, function(i)(i[i >= 3 & !is.na(i)])))

#$A
#[1] 3

#$B
#[1] 3 4

#$D
#[1] 7

答案 1 :(得分:0)

您也可以使用purrrmap执行此操作。 map跨组应用该函数,然后discard(is_empty)删除不包含值的列表(即由函数过滤掉的列表)。 ~用于指定要应用于每个列表的函数,.是通过函数的每个列表的占位符。

library(purrr)

map(h, ~.[. >= 3]) %>% discard(is_empty)

$A
[1] 3

$B
[1] 3 4