我有一个具有这种结构的对象:
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的解决方案,但失败了。
感谢您的帮助。
答案 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)