2016-07-22 15 views
0

Ich möchte die Zeilen aus einer data.table entfernen, die nur NAs enthalten.Entfernen Sie Linien mit nur NAs aus data.table

> 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 

Normalerweise würde ich es mit apply(dat, 1, ...) tun, die leider nicht auf einem data.table funktioniert, aber es führt mich zu dieser uneleganten Lösung:

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

Wie kann dies die schnellste Art und Weise erreicht werden, ohne zu wissen, die Spaltennamen?

+3

Warum würde es nicht auf einer data.table funktionieren?!? – Arun

Antwort

3

Wir Reduce mit is.na und &

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

Oder einem kompakten, aber nicht so effizientem Ansatz wären

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

auch verwenden können, wie @Frank kommentiert join eine Basis Annäherung,

tab[!tab[NA_integer_], on = names(tab)] 
+2

Wahrscheinlich sehr ineffizient, aber es gibt auch 'df [! Df [NA_integer_], on = Namen (df)]' - gegen Join in allen Spalten gegen eine Reihe von NAs. – Frank

2

Eine weitere Idee:

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

Ich mag

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

Es ist intuitiv zu mir, aber ich bin nicht sicher, dass es der schnellste Ansatz.

HTH

Verwandte Themen