2016-07-22 62 views
0

我想刪除data.table中只包含NAs的行。從data.table刪除只有NAs的行

> 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 

這怎麼可能不知道實現的最快方法列名?

+3

爲什麼不能在data.table?上工作? – Arun

回答

3

我們可以使用Reduceis.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)] 
+2

可能超級低效,但也有'df [!df [NA_integer_],on = names(df)]' - 針對一排NAs反向加入所有列。 – Frank

2

另一個想法:

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

我很喜歡

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

這是直觀的給我,但我不知道它是最快的辦法。

HTH