2015-10-02 5 views
10

I因子変数のレベルをドロップするdplyrパッケージからfilterを使用する場合、filterNA値が低下します。ここでは例です:dplyrのフィルタは因子変数からNA値を落とすのはなぜですか?

library(dplyr) 
set.seed(919) 
(dat <- data.frame(var1 = factor(sample(c(1:3, NA), size = 10, replace = T)))) 
# var1 
# 1 <NA> 
# 2  3 
# 3  3 
# 4  1 
# 5  1 
# 6 <NA> 
# 7  2 
# 8  2 
# 9 <NA> 
# 10 1 

filter(dat, var1 != 1) 
# var1 
# 1 3 
# 2 3 
# 3 2 
# 4 2 

これは理想的ないないようだ - 私はvar1 == 1行をドロップしたかったです。

これはfilterが、その後低下任意のcomparison with NA returns NA、ため、発生しているように見えます。したがって、たとえば、filter(dat, !(var1 %in% 1))は正しい結果を生成します。しかしfilterNAの値をドロップしないように指示する方法はありますか?

+2

@akrun:P。まあ、彼は似ている 'フィルタ(%1でDAT、!(VAR1%))を'述べたように、私は、OPはすでにこのことについて知っていると思ったが、私は、これは 'dplyrでそれを行うための唯一の方法だと思う::フィルタ '。 – LyzandeR

+1

'NA'値を落とさないように' filter'に明示的に指示する方法はないと思いますが、一般的に、論理NAクエリは、ベースの '%in% '演算子を使って直感的に扱うことができ、 %ni%< - 否定( '%in%') '。したがって、動作する 'filter(dat、var1%ni%1)'を使うことができます。 http://stackoverflow.com/a/11303276/4269699およびhttp://stackoverflow.com/a/27015823/4269699 – wjchulme

+1

はい、私はこのアプローチと@LyzandeRが回答に使用したアプローチの両方について知っていました。 filterには "keep NA"の明示的なオプションがないようですので、これらの回避策は問題ありません。ご協力いただきありがとうございます。 –

答えて

14

あなたは、この使用することができます

filter(dat, var1 != 1 | is.na(var1)) 
    var1 
1 <NA> 
2 3 
3 3 
4 <NA> 
5 2 
6 2 
7 <NA> 

をそして、それはしません。

test_that("filter discards NA", { 
    temp <- data.frame(
    i = 1:5, 
    x = c(NA, 1L, 1L, 0L, 0L) 
) 
    res <- filter(temp, x == 1) 
    expect_equal(nrow(res), 2L) 
}) 

上記githubからfilterのためのテストから撮影されたこのテスト:あなたは以下から見ることができるよう

はまた、ちょうど完了のため、落下NASはfilterの意図した動作です。私はこの通知を取得していないいくつかの理由について

+2

意見に基づいた領域に少し触れると、なぜこれが選択されたアプローチであるか考えていますか?この行動は私には予想外でした(私は今日それに噛まれました)。 – Heisenberg

+1

@Heisenberg私は、Hadleyによれば、ほとんどの人がフィルタリングの際にいかなるNAsも取得したくないと仮定しています。しかし、それは開発者/管理者、すなわちHadleyの質問です。 – LyzandeR

関連する問題