如何将列表列表减少为仅包含符合特定条件的值?我看到了类似的问题,并查看了Filter
,Reduce
等,但似乎无法发挥作用。
> 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
答案 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)
您也可以使用purrr
和map
执行此操作。 map
跨组应用该函数,然后discard(is_empty)
删除不包含值的列表(即由函数过滤掉的列表)。 ~
用于指定要应用于每个列表的函数,.
是通过函数的每个列表的占位符。
library(purrr)
map(h, ~.[. >= 3]) %>% discard(is_empty)
$A
[1] 3
$B
[1] 3 4