Как удалить нулевые векторы из списка в списке - PullRequest
0 голосов
/ 14 ноября 2018

Проблема:

У меня есть список из двух списков из трех векторов.Я хотел бы удалить нулевой вектор из каждого подсписка.

Пример:

x <- list(x1=c(0,0,0), x2=c(3,4,5), x3=c(45,34,23))
y <- list(y1=c(2,33,4), y2=c(0,0,0), y3=c(4,5,44))
z <- list(x, y)

Попробуйте:

Я попробовал это:

res <- lapply(1:2, function(i) {lapply(1:3, function(j) z[[i]][[j]][z[[i]][[j]] != 0])})

, который дал мне это:

> res
[[1]]
[[1]][[1]]
numeric(0)

[[1]][[2]]
[1] 3 4 5

[[1]][[3]]
[1] 45 34 23


[[2]]
[[2]][[1]]
[1]  2 33  4

[[2]][[2]]
numeric(0)

[[2]][[3]]
[1]  4  5 44

Проблема с выводом:

Не хочу numeric(0).

Ожидаемый вывод:

x= list(x2, x3)
y=list(y1, y3)

Есть идеи, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 14 ноября 2018

с purrr это может быть очень компактно

library(purrr)
map(z, keep ,~all(.!=0))
# [[1]]
# [[1]]$x2
# [1] 3 4 5
# 
# [[1]]$x3
# [1] 45 34 23
# 
# 
# [[2]]
# [[2]]$y1
# [1]  2 33  4
# 
# [[2]]$y3
# [1]  4  5 44

Если бы не досадные предупреждения, мы могли бы просто сделать map(z, keep , all)

0 голосов
/ 14 ноября 2018

Или:

x <- list(x1=c(0,0,0), x2=c(3,4,5), x3=c(45,34,23))
y <- list(y1=c(2,33,4), y2=c(0,0,0), y3=c(4,5,44))
z <- list(x, y)

lapply(z, function(a) a[unlist(lapply(a, function(b) !identical(b, rep(0,3))))])

#[[1]]
#[[1]]$`x2`
#[1] 3 4 5
#
#[[1]]$x3
#[1] 45 34 23
#
#
#[[2]]
#[[2]]$`y1`
#[1]  2 33  4
#
#[[2]]$y3
#[1]  4  5 44
0 голосов
/ 14 ноября 2018

Вы можете попробовать tidyverse, если структура вложенного списка не важна

library(tidyverse)
z %>% 
  flatten() %>% 
  keep(~all(. != 0))
$x2
[1] 3 4 5

$x3
[1] 45 34 23

$y1
[1]  2 33  4

$y3
[1]  4  5 44
0 голосов
/ 14 ноября 2018

Учитывая вашу структуру списка списков, я бы сказал следующее:

filteredList <- lapply(z, function(i) Filter(function(x) any(x != 0), i))

x <- filteredList[[1]]
y <- filteredList[[2]]

x
##$`x2`
##[1] 3 4 5

##$x3
##[1] 45 34 23
y
##$`y1`
##[1]  2 33  4

##$y3
##[1]  4  5 44
0 голосов
/ 14 ноября 2018

определите z как

z <- c(x, y)
# z <- unlist(z, recursive = F)  if you cannot define z by yourself.

, затем используйте:

z[sapply(z, any)]

#$`x2`
#[1] 3 4 5

#$x3
#[1] 45 34 23

#$y1
#[1]  2 33  4

#$y3
#[1]  4  5 44

Обратите внимание:

Как в традиции lang C.Каждое целое / числовое значение! = 0 будет приведено к TRUE.Таким образом, в этой задаче мы можем использовать эту логику.?any будет иметь значение FALSE, если все значения равны 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...