1) Это однострочное решение, не использующее пакеты.
Используйте na.omit для каждого столбца, преобразуя каждый класс ts
.cbind
будет обрабатывать переменные длины автоматически.[TRUE, ]
в конце удаляет класс ts
.
# test input
DF <- data.frame(V1 = c("a1", NA, "a2"), V2 = c(NA, NA, "a3"),
V3 = c("a4", NA, NA), stringsAsFactors = FALSE)
res1 <- do.call("cbind", lapply(DF, function(x) ts(na.omit(x))))[TRUE, ]
, давая эту матрицу:
> res1
V1 V2 V3
[1,] "a1" "a3" "a4"
[2,] "a2" NA NA
Если вы предпочитаете результат с фреймом данных, используйте:
as.data.frame(res1, stringsAsFactors = FALSE)
2) Это альтернативное решение, которое также состоит из одной строки и не использует никаких пакетов.Он пропускает NA, а затем расширяет результирующий вектор до необходимого количества строк.Наконец, он формирует его в data.frame.
res2 <- replace(DF, TRUE, lapply(DF, function(x) `length<-`(na.omit(x), nrow(DF))))
, предоставляя этот data.frame:
> res2
V1 V2 V3
1 a1 a3 a4
2 a2 <NA> <NA>
3 <NA> <NA> <NA>
Этот немного отличается, так как он создает data.frame, а не матрицуи это делает результирующий data.frame такими же размерами, что и входные данные.Если вы хотите отбросить строки, которые все NA, то
res2[rowSums(!is.na(res)) > 0, ]
## V1 V2 V3
## 1 a1 a3 a4
## 2 a2 <NA> <NA>