のNA

2016-05-31 10 views
2

がある場合、私は、私は任意の助けをいただければ幸いRのNA

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,] 

をベースに変換できませんdplyrで作業filter文を持っているRをベースとするdplyrフィルタを翻訳。説明するために

+0

アドオン '&! is.na(x $ v2) ' –

答えて

2

別に
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 

をrownameから、それは同じ結果を与えます。いくつかの状況で

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 

、あなたはNA sの問題が発生することがあります。次に、論理文をwhichにラップすることをお勧めします。 filterはデフォルトでNAを除外します。例えば。

# 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

男、私は' && 'が短く循環していると思っていました、そして、'本質的に 'x && y 'を意味するのはxが偽であれば、yを評価することさえありません。同様の 'x || 「y」は、xが真であることを意味し、yの両方を評価しない場合を意味するが、明らかに間違っていた。おかげで – Carl

+0

まあ、それです!しかし、あなたはそれをここでは望んでいません。 'TRUE'と' FALSE'文のベクトルを各観測ごとに1つずつ求めます。 'R'がベクトルを期待しているときに一つの' FALSE'文しか与えないと、 'R'はそれをリサイクルします。したがって、それぞれの行ごとに「偽」と言うので、上記の結果(行はありません)が得られます。 – coffeinjunky

1

subset同様dplyrfilter塩基R、および関数です。サブセットで十分ですか、何らかの理由でかっこ表記が必要ですか?

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

dplyrビア:基本R/subset経由

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

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