Удалить NA из списка списков
У меня есть матрица data.mat, которая выглядит так:
A B C D E
45 43 45 65 23
12 45 56 NA NA
13 4 34 12 NA
Я пытаюсь превратить это в список списков, где каждая строка представляет собой один список в большем списке. Я делаю следующее:
list <- tapply(data.mat,rep(1:nrow(data.mat),ncol(data.mat)),function(i)i)
который дает мне список списков, включая NA, такие как:
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56 NA NA
$`3`
[1] 13 4 34 12 NA
Но то, что я хочу, это:
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56
$`3`
[1] 13 4 34 12
Есть ли хороший способ удалить NA как во время звонка, так и по факту?
3 ответа
Решение
Конечно, вы можете использовать lapply
как это:
> lapply(list, function(x) x[!is.na(x)])
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56
$`3`
[1] 13 4 34 12
Ваши образцы данных:
data.mat <- data.matrix(read.table(text = "A B C D E
45 43 45 65 23
12 45 56 NA NA
13 4 34 12 NA ", header = TRUE))
Чтобы разделить на строку:
row.list <- split(data.mat, row(data.mat))
Чтобы удалить NA:
Map(Filter, list(Negate(is.na)), row.list)
или же
lapply(row.list, Filter, f = Negate(is.na))
Все в одном кадре:
Map(Filter, list(Negate(is.na)), split(data.mat, row(data.mat)))
Вы могли бы сделать это:
apply(data.mat, 1, function(x) x[!is.na(x)])
Выход:
[[1]]
A B C D E
45 43 45 65 23
[[2]]
A B C
12 45 56
[[3]]
A B C D
13 4 34 12
Если вы не хотите имен:
apply(data.mat, 1, function(x) unname(x[!is.na(x)]))
Если существует вероятность того, что в каждой строке будет одинаковое количество NA, будет безопаснее использовать:
split(apply(data.mat, 1, function(x) unname(x[!is.na(x)])), 1:nrow(data.mat))