移除数值向量列表中仅包含零的向量

时间:2019-03-14 14:12:02

标签: r

我有一个具有这种结构的对象:

l1 <- list(A=(list(a=c(1,2,3), b=c(1,4,5), z=c(1,2,3))),
           B=(list(a=c(1,2,3), b=c(1,4,5), z=c(1,2,3))),
           D=(list(a=c(0,0,0), b=c(0,0,0), z=c(0,0,0))))

我想删除l1中所有仅包含零的列表,在这种情况下为l1["D"]。我在lapply中尝试了x!= 0的解决方案,但失败了。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我们可以尝试

Filter(length, lapply(l1, function(x) Filter(function(y) !all(y ==0), x)))

或与discard

library(purrr)
discard(l1, ~ all(unlist(.x) == 0) )
#$A
#$A$a
#[1] 1 2 3

#$A$b
#[1] 1 4 5

#$A$z
#[1] 1 2 3


#$B
#$B$a
#[1] 1 2 3

#$B$b
#[1] 1 4 5

#$B$z
#[1] 1 2 3

或带有keep

keep(l1, ~ any(unlist(.x) != 0))

答案 1 :(得分:2)

我们可以使用sapply

l1[!sapply(l1, function(x) all(unlist(x) == 0))]

#$A
#$A$a
#[1] 1 2 3

#$A$b
#[1] 1 4 5

#$A$z
#[1] 1 2 3


#$B
#$B$a
#[1] 1 2 3

#$B$b
#[1] 1 4 5

#$B$z
#[1] 1 2 3

一些purrr变体

library(purrr)
l1[map_lgl(l1, ~ !all(flatten_dbl(.) == 0))]

keep

keep(l1, ~ !all(flatten_dbl(.) == 0))

答案 2 :(得分:2)

使用Filter

Filter(function(x) any(unlist(x) != 0), l1)