R удалить список, полный NA из списка списков - PullRequest
0 голосов
/ 18 мая 2018

У меня есть список списков, которые могут содержать значения NA.Как я могу удалить списки, которые заполнены значениями NA, имея в виду, что если в списке есть не-значения NA, эти значения и значения NA не должны быть удалены?

Пример ввода:

myList <- list()
myList[[1]] <- c(1,2,3)
myList[[2]] <- c(4,5)
myList[[3]] <- c(NA,NA,NA,NA,NA)
myList[[4]] <- c(NA, 6, 7, NA)
myList[[5]] <- NA

Требуемый вывод:

[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
[1] NA  6  7 NA

Пока я смог сделать:

test <- lapply(myList, function(x) x[!all(is.na(x))])

и получил в качестве вывода:

[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
logical(0)

[[4]]
[1] NA  6  7 NA

[[5]]
logical(0)

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Вы можете "убить" элементы, присвоив ему NULL.

myList[sapply(myList,function(x) all(is.na(x)))] <- NULL
0 голосов
/ 18 мая 2018

Другой вариант - discard

library(purrr)
discard(myList, ~ all(is.na(.x)))
#[1]]
#[1] 1 2 3

#[[2]]
#[1] 4 5

#[[3]]
#[1] NA  6  7 NA
0 голосов
/ 18 мая 2018

Filter на помощь:

Filter(function(x) !all(is.na(x)), myList)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 4 5
#
#[[3]]
#[1] NA  6  7 NA
0 голосов
/ 18 мая 2018

Вы можете поместить элементы списка как минимум в одно значение, отличное от NA:

> myList[sapply(myList, function(x) sum(!is.na(x))) > 0]
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
[1] NA  6  7 NA
...