gpt4 book ai didi

r - 当没有非 NA 值时,汇总不会从最大值返回警告

转载 作者:行者123 更新时间:2023-12-03 23:53:06 24 4
gpt4 key购买 nike

max(x, na.rm = TRUE)被调用时没有非 NA值,它返回 -Inf ,有警告。但是,在某些情况下,summarise函数在 dplyr不返回警告:

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

尽管我使用的是 dplyr 的“开发”版本,我也在 CRAN 中可用的版本上进行了测试,结果相同。

最佳答案

对于 max() ,可以使用混合版本,该版本对于分组数据帧的运行速度要快得多,因为整个评估可以在 C++ 中进行,而无需对每个组进行 R 回调。在 dplyr 0.5.0 中,当满足以下所有条件时,将触发混合版本:

  • 第一个参数引用数据框中存在的变量
  • 第二个参数是 logical常数

  • hybrid vignette了解更多详情。
    max()的混合版在某些方面与 R 实现不同:
  • 不会为空向量引发警告,静默返回 -Inf
  • 我认为情况总是如此;我们不妨在这里添加一个警告,但我怀疑 other users won't be happy about this
  • 全- NA矢量将返回 NA即使与 na.rm = TRUE
  • 这肯定是个bug,我filed an issue

  • 在您的示例中, c(NA, NA)logical 的向量,因此 dplyr 回退到“常规”评估,每个组都有一个 R 回调。如果您需要原始行为,只需使用包装器或别名;混合评估器将回退到常规评估:
    max_ <- max
    data_frame(a = NA_real_) %>% summarise(a = max_(a, na.rm = TRUE))
    ## # A tibble: 1 × 1
    ## a
    ## <dbl>
    ## 1 -Inf
    ## Warning message:
    ## In max_(a, na.rm = TRUE) : no non-missing arguments to max; returning -Inf

    关于r - 当没有非 NA 值时,汇总不会从最大值返回警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895983/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com