2017-12-14 15 views
9

を生成しながらDplyrがNaNを生成し、次の玩具データ及び計算を検討:ベースRはNA

library(dplyr) 

df <- tibble(x = 1) 

stats::sd(df$x) 

dplyr::summarise(df, sd_x = sd(x)) 

計算はsummariseNaNを生成dplyr関数に含まれている第二のに対しNAにおける最初の計算結果、。私は両方の計算が同じ結果を生み出すことを期待しています。なぜ彼らは異なるのでしょうか?

+0

「NaNとInfの違いは何ですか?またRのNULLとNAは違いますか?」(https://stackoverflow.com/questions/15496361/what-is-the-difference-between-nan-and) -inf-and-null-and-na-in-r) – PoGibas

+1

私は複製できます。 dplyrバージョン0.7.4 - CRANの最新バージョン –

+0

同じです。しかし、何のためにそれが必要ですか? 'is.na()'と尋ねると、両方とも 'TRUE'を返します。 – loki

答えて

6

これは別の機能を呼び出しています。私は機能が何であるかはっきりしないが、それはstatsではない。

dplyr::summarise(df, sd_x = sd(x)) 
# A tibble: 1 x 1 
    sd_x 
    <dbl> 
1 NaN 

しかし、ここで呼ばれる:ここで呼び出されることはありません

dplyr::summarise(df, sd_x = stats::sd(x)) 
# A tibble: 1 x 1 
    sd_x 
    <dbl> 
1 NA 

debugonce(sd) # debug to see when sd is called 

dplyr::summarise(df, sd_x = stats::sd(x)) 
debugging in: stats::sd(1) 
debug: sqrt(var(if (is.vector(x) || is.factor(x)) x else as.double(x), 
    na.rm = na.rm)) 
... 

更新

ほのめかし、summarisesdはRの外で計算されることを表示されます〜でこのヘッダーファイルの中で:https://github.com/tidyverse/dplyr/blob/master/inst/include/dplyr/Result/Sd.h

多くの関数はdplyrによって再定義されているようです。 varが両方のケースで同じ結果を与えることを考えれば、sdの振る舞いはバグだと思う。

+0

あなたはR dplyrとRバージョンは何ですか?私はバグを再現できないことに驚いています... – storaged

+0

私は 'dplyr :: mutate(df、var_x = var(x))'を実行すると 'NA'を取得します。私はその行動がバグであるという提案に基づいてこの答えを受け入れました。 – ricke