Удаление векторов, содержащих только ноль, в списке списков числовых векторов - PullRequest
2 голосов
/ 14 марта 2019

У меня есть объект этой структуры:

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"]. Я пробовал решения с x! = 0 в пределах lapply, но не смог.

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Мы могли бы использовать 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 голосов
/ 14 марта 2019

Использование Filter:

Filter(function(x) any(unlist(x) != 0), l1)
2 голосов
/ 14 марта 2019

Мы можем попробовать

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...