удалить столбцы со значениями NA из списка матриц - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть список матриц, и мне нужно удалить столбцы, содержащие значения NA, внутри каждой матрицы.

Я попытался использовать lapply с! Is.na, чтобы применить это ко всем матрицам во всем списке, но он возвращает список векторов с исключенными NA, тогда как я все еще хочу список матриц (только без столбцов, содержащих NA).

> my_list
$mat1
 V1   V2   V3
[1,] 1 5 NA
[1,] 2 6 NA
[1,] 3 7 NA
[1,] 4 8 NA

$mat2
 V1   V2   V3
[1,] 1 NA 9
[1,] 2 NA 10
[1,] 3 NA 11
[1,] 4 NA 12

> lapply(my_list,function(x) x[!is.na(x)])
$mat1
 [1]  1  2  3  4  5  6  7  8

$mat2
 [1]  1  2  3  4  9 10 11 12

Вывод, который я пытаюсь получить, это:

$mat1
 V1   V2
[1,] 1 5
[1,] 2 6
[1,] 3 7
[1,] 4 8

$mat2
 V1   V3
[1,] 1 9
[1,] 2 10
[1,] 3 11
[1,] 4 12

Ответы [ 2 ]

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

Или другой вариант - tidyverse с select_if после преобразования в data.frame

library(tidyverse)
map(lst1, ~ .x %>% 
               as.data.frame %>% 
               select_if(~ all(!is.na(.))))
#[[1]]
#  V1 V2
#1  1  5
#2  2  6
#3  3  7
#4  4  8

#[[2]]
#  V1 V3
#1  1  9
#2  2 10
#3  3 11
#4  4 12
0 голосов
/ 21 ноября 2018

Для одной матрицы apply(is.na(mat), 2, any) дает логический индекс для столбцов с NA.Чтобы удалить столбцы, выполните:

mat[, !apply(is.na(mat), 2, any)]

Для этого с помощью списка матриц выполните:

lapply(my_list, function(mat) mat[, !apply(is.na(mat), 2, any)])

Данные:

> dput(my_list)
list(structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, NA, NA, NA, 
NA), .Dim = c(4L, 3L), .Dimnames = list(NULL, c("V1", "V2", "V3"
))), structure(c(1L, 2L, 3L, 4L, NA, NA, NA, NA, 9L, 10L, 11L, 
12L), .Dim = c(4L, 3L), .Dimnames = list(NULL, c("V1", "V2", 
"V3"))))
...