2016-05-31 19 views
2

Ich habe eine Arbeits filter Aussage in dplyr, die ich nicht R stützen übersetzen kann aufÜbersetzen dplyr Filter R zu stützen, wenn es NAs sind

library(dplyr) 
x <- data.frame(
    v1 = c("USA", "Canada", "Mexico"), 
    v2 = c(NA, 1:5) 
) 

x %>% filter(v1=="Canada",v2 %in% 3:5) 

x[x$v1=="Canada" && x$v2 %in% 3:5,] 

Jede Hilfe würde geschätzt. Um

+0

Add '&! is.na (x $ v2) ' –

Antwort

2

zu illustrieren:

library(dplyr) 
x <- data.frame(
    v1 = c("USA", "Canada", "Mexico"), 
    v2 = c(NA, 1:5) 
) 

# filter 
x %>% filter(v1=="Canada",v2 %in% 3:5) 
     v1 v2 
1 Canada 4 

# your approach 
x[x$v1=="Canada" && x$v2 %in% 3:5,] 
v1 v2 
<0 rows> (or 0-length row.names) 

# second & removed 
x[x$v1=="Canada" & x$v2 %in% 3:5,] 
     v1 v2 
5 Canada 4 

Neben der rowName, gibt es das gleiche Ergebnis.

Schauen Sie sich das Beispiel zu verstehen, was vor sich ging (aus here)

-2:2 >= 0 
[1] FALSE FALSE TRUE TRUE TRUE 
-2:2 >= 0 & -2:2 <= 0 
[1] FALSE FALSE TRUE FALSE FALSE 
-2:2 >= 0 && -2:2 <= 0 
[1] FALSE 

In manchen Situationen können Probleme mit NA s begegnen. Dann ist es ratsam, logische Anweisungen in which zu verpacken. filter filtert NA standardmäßig aus. Z.B.

# will include NA: 
x[x$v2 > 3,] 
     v1 v2 
NA <NA> NA 
5 Canada 4 
6 Mexico 5 

# will exclude NA 
x[which(x$v2 > 3),] 
     v1 v2 
5 Canada 4 
6 Mexico 5 
+0

Mann, ich dachte" && 'war ein Kurzschluss" und "bedeutet im Wesentlichen' x && y' bedeutet, wenn x falsch ist, nicht einmal die Bewertung von y. Ähnliches 'x || y 'bedeutet, wenn x wahr ist, nicht einmal beide, y, aber ich war anscheinend sehr falsch. Danke – Carl

+0

Nun, es ist! Aber das willst du hier nicht. Sie möchten einen Vektor von 'TRUE'- und' FALSE'-Anweisungen, einen für jede Beobachtung. Wenn Sie nur eine einzige 'FALSE'-Anweisung angeben, wenn' R' einen Vektor erwartet, wird 'R' diese wiederverwenden. Daher sagen Sie für jede Zeile "FALSE", und Sie erhalten das obige Ergebnis (keine Zeilen). – coffeinjunky

1

subset ist in Basis R und funktioniert ähnlich wie in filterdplyr. Reicht die Untermenge für Sie aus oder benötigen Sie die Klammernotation aus irgendeinem Grund?

> x <- data.frame(
+  v1 = c("USA", "Canada", "Mexico"), 
+  v2 = c(NA, 1:5) 
+) 

Via dplyr:

> x %>% filter(v1=="Canada",v2 %in% 3:5) 
     v1 v2 
1 Canada 4 

Via Basis R/subset:

> subset(x, v1 == 'Canada' & v2 %in% 3:5) 
     v1 v2 
5 Canada 4