Dplyr产生NaN,而碱R产生NA

时间:2017-12-14 13:02:05

标签: r dplyr nan na

考虑以下玩具数据和计算:

library(dplyr)

df <-  tibble(x = 1)

stats::sd(df$x)

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

第一个计算结果为NA,而第二个计算结果包含在dplyr函数summarise中,产生NaN。我希望两个计算都能产生相同的结果,我想知道为什么它们不同?

1 个答案:

答案 0 :(得分:6)

它正在调用一个不同的功能。我不清楚函数是什么,但它不是stats函数。

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 = sd(x))
# A tibble: 1 x 1
   sd_x
  <dbl>
1   NaN

但在这里打电话:

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))
...

更新

sd内的summarise似乎是在R之外计算的,在此标题文件中暗示:https://github.com/tidyverse/dplyr/blob/master/inst/include/dplyr/Result/Sd.h

dplyr似乎重新定义了许多功能。鉴于var在两种情况下给出相同的结果,我认为sd行为是一个错误。