Удалить строки только с NA из data.table

Я хочу удалить строки из data.table, которые содержат только NA.

> tab = data.table(A = c(1, NA, 3), B = c(NA, NA, 3))
> tab
    A  B
1:  1 NA
2: NA NA
3:  3  3

Обычно я бы сделал это сapply(dat, 1, ...) который, к сожалению, не работает на data.table, но приводит меня к этому не элегантному решению:

> tab[apply(as.data.frame(tab), 1, function(x) !all(is.na(x))), ]
   A  B
1: 1 NA
2: 3  3

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

 Arun22 июл. 2016 г., 14:00
Почему он не работает на data.table?!?

Ответы на вопрос(3)

Решение Вопроса

Мы можем использоватьReduce сis.na а также&

tab[!Reduce(`&`, lapply(tab, is.na))]
#   A  B
#1: 1 NA
#2: 3  3

Или компактный, но не очень эффективный подход

tab[rowSums(!is.na(tab)) != 0L]

Кроме того, как прокомментировал @Frank, подход, основанный на объединении,

tab[!tab[NA_integer_], on = names(tab)]
 Tom03 июл. 2019 г., 16:06
 akrun03 июл. 2019 г., 15:53
@Tom Можете ли вы опубликовать как новый вопрос
 Frank22 июл. 2016 г., 22:32
Возможно супер неэффективно, но есть иdf[!df[NA_integer_], on=names(df)] - против объединения на всех столбцах против ряда NA.
 Tom03 июл. 2019 г., 15:52
Есть ли способ сделать этот код исключить первый столбец? У меня есть data.table, где я хочу удалить строки, которые полностью пусты, кроме первого столбца.

Мне очень нравится

tab <- tab[sapply(1:nrow(tab), function(i){!all(is.na(tab[i,]))}),]

Для меня это интуитивно понятно, но я не уверен, что это самый быстрый подход.

НТН

Еще одна идея:

library(dplyr)
df %>% 
  filter(rowSums(is.na(.)) < length(.))

Ваш ответ на вопрос