当 max(x, na.rm = TRUE)
被调用时,如果没有非NA
值存在,它会返回-Inf
,并出现警告。但是,在某些情况下,dplyr
中的summarise
函数不会返回警告:
library(magrittr)
library(dplyr)
df1 <- data.frame(a = c("a","b"), b = c(NA,NA))
df1 %>% group_by(a) %>% summarise(x = max(b, na.rm = TRUE))
# Three warnings, as expected.
df2 <- data.frame(a = c("a","b"), b = c(1,NA))
df2 %>% group_by(a) %>% summarise(x = max(b, na.rm = TRUE))
# No warning. Unexpected.
有趣的是,如果我重新命名该函数,就会按预期收到警告:
# Pointer to same function.
stat <- max
df1 <- data.frame(a = c("a","b"), b = c(NA,NA))
df1 %>% group_by(a) %>% summarise(x = stat(b, na.rm = TRUE))
# Three warnings, as expected.
df2 <- data.frame(a = c("a","b"), b = c(1,NA))
df2 %>% group_by(a) %>% summarise(x = stat(b, na.rm = TRUE))
# Single warning, as expected.
实际上,我认为应该是两个警告而不是三个,因为只有两组需要进行summarise
。但我不确定内部警告系统的工作方式,所以也许三个警告就像预期的那样。
我的问题是:为什么summarise
在特定情况下没有输出警告,如果这是预期的,那么一个简单的函数重命名为什么会改变这种行为?
我的sessionInfo()
:
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.5 LTS
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.5.0.9000 magrittr_1.5
loaded via a namespace (and not attached):
[1] lazyeval_0.2.0.9000 R6_2.2.0 assertthat_0.1
[4] tools_3.3.2 DBI_0.5-1 tibble_1.2
[7] Rcpp_0.12.8
尽管我正在使用 "dev" 版本的 dplyr
,但我也已经在可用的 CRAN 版本上进行了测试,并获得了相同的结果。
group_by
中似乎有一个错误,因为没有使用它,summarize
可以给出预期的输出。此外,在您的第二种情况中,mutate
也不会返回警告。 - David ArenburgNA
而不是-Inf
,这意味着问题出现在警告之前的某个地方。 - David Arenburgdf2 %>% group_by(a) %>% summarise(length(na.omit(b)))
确实证实了组b
正在传递一个长度为零的向量给max()
。 - smci