2016-04-14 14 views
0

filtern Ich versuche, durch NAs zu filtern (einfach die Zeilen mit NA in der angegebenen Spalte halten), indem Sie Dplyr und die Filterfunktion verwenden. Mit dem folgenden Code werden nur die Spaltenbeschriftungen ohne Daten zurückgegeben. Schreib ich den Code richtig? Auch wenn es möglich ist (oder einfacher), ohne dplyr auszukommen, wäre das auch interessant zu wissen. Vielen Dank.Wie kann ich nach NA in R-Programmierung mit Dplyr

filter(tata4, CompleteSolution == "NA", KeptInformed == "NA") 
+1

'tata4 [is.na (tata4 & CompleteSolution) & is.na (tata4 $ KeptInformed),]' vorausgesetzt, diese sind jeweils Spalten. Egal, ich denke 'is.na()' ist was du willst. – Badger

+1

Verwenden Sie 'is.na' anstelle von' == "NA" ', das nach einer Zeichenfolge sucht. – alistaire

+1

Beim nächsten Mal sollten Sie in Erwägung ziehen, ein reproduzierbares Beispiel zu geben, wie es Steven im Abschnitt "Daten" seiner Antwort getan hat. – Frank

Antwort

4

Sie nutzen könnten complete.cases()

dplyr::filter(df, !complete.cases(col1, col2)) 

Welche gibt:

# col1 col2 col3 
#1 NA 5 5 
#2 NA 6 6 
#3 5 NA 7 

Benchmark

large_df <- df[rep(seq_len(nrow(df)), 10e5), ] 

Die bisherigen Ergebnisse:

library(microbenchmark) 
mbm <- microbenchmark(
    akrun1 = large_df[rowSums(is.na(large_df[1:2]))!=0, ], 
    akrun2 = large_df[Reduce(`|`, lapply(large_df[1:2], is.na)), ], 
    steven = filter(large_df, !complete.cases(col1, col2)), 
    times = 10) 

enter image description here

#Unit: milliseconds 
# expr  min  lq  mean median  uq  max neval cld 
# akrun1 814.0226 924.0837 1248.9911 1208.7924 1434.2415 2057.1338 10 c 
# akrun2 499.3404 671.9900 736.2418 687.9194 861.4477 1068.1232 10 b 
# steven 112.9394 113.0604 214.1688 198.4542 299.7585 355.1795 10 a 

Daten

df <- structure(list(col1 = c(1, 2, 3, 4, NA, NA, 5), col2 = c(1, 2, 
3, 4, 5, 6, NA), col3 = c(1, 2, 3, 4, 5, 6, 7)), .Names = c("col1", 
"col2", "col3"), row.names = c(NA, -7L), class = "data.frame") 
+1

Verstanden. Vielen Dank. – Stephertless

1

Wir rowSums auf logische Matrix verwenden könnte (is.na(df[1:2])), prüfen, ob es nicht gleich 0 ist, um einen logischen Vektor zu erhalten und diesen zur Untermenge zu verwenden.

df[rowSums(is.na(df[1:2]))!=0,] 
# col1 col2 col3 
#5 NA 5 5 
#6 NA 6 6 
#7 5 NA 7 

Oder mit Reduce und lapply

df[Reduce(`|`, lapply(df[1:2], is.na)),]