【问题标题】:summarise returning -inf when using na.rm = TRUE总结使用 na.rm = TRUE 时返回 -inf
【发布时间】:2018-02-27 14:20:51
【问题描述】:

我最近构建了一个简单的 R 脚本来总结三个不同的数据帧。自从更新到最新版本的 R 和 R Studio 后,当我在 dplyr 中仅对其中一个数据帧使用 summarise 函数(其他两个都很好)时,我遇到了一个我以前从未见过的输出。我还收到了一系列我不熟悉的警告。请注意,在更新之前,我完全按照编写的方式运行了脚本,没有任何数据帧出现问题。

有问题的数据框叫做VO2,它的设置如下:

Name        Sex       VO2
AthleteA    M         50
AthleteA    M         52
AthleteA    M         NA
AthleteB    M         49
AthleteB    M         56
AthleteB    M         47 
AthleteC    M         42
AthleteC    M         NA
AthleteC    M         41 
AthleteD    M         NA
AthleteD    M         NA
AthleteD    M         NA 

我运行的代码是:

Test.Summary.VO2 = VO2 %>% group_by(Name, Sex) %>% 
summarise(Best.Score = max(VO2, na.rm=TRUE))

此代码生成以下摘要:

Name       Sex     Best.Score
AthleteA    M        52
AthleteB    M        56
AthleteC    M        42
AthleteD    M        -Inf

-Inf 值在输出中是全新的。我无法弄清楚为什么它现在出现在只有 NA 的情况下。

如上所述,我对第二个数据框有完全相同的布局并运行相同类型的摘要。在这里一切正常。当我使用 na.rm=TRUE 进行总结时,它会删除 NA 案例而不用 -Inf 值替换 NA 案例。

这有点不寻常的是,当我使用以下方式查看数据框时:

View(Test.Summary.VO2)

我收到以下一系列警告消息:

There were 38 warnings (use warnings() to see them)
warnings()
Warning messages:
1: Unknown or uninitialised column: 'Quad'.
2: Unknown or uninitialised column: 'Quad'.
3: Unknown or uninitialised column: 'Quad'.
4: Unknown or uninitialised column: 'Quad'.

稍后在脚本中,我生成了一个名为“Quad”的新变量。但是即使在我清除环境并重新启动 R Studio 之后,上面的警告也会出现。我什至尝试重命名 .csv 文件并使用不同的数据框名称导入。就好像脚本后面生成的列“Quad”在环境中的某个地方徘徊。

我真的不知道这里可能会发生什么。

我希望 Stack 的一位 R 专家可以为我提供有关如何解决此问题的想法。

感谢您的考虑。

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    ?max:

    数字空集的最小值和最大值是 +Inf 和 -Inf(按此顺序!),以确保传递性,例如,min(x1, min(x2)) == min(x1, x2)。对于数字 x max(x) == -Infmin(x) == +Inf 每当 length(x) == 0 (如果要求删除缺失值之后)。但是,pmaxpmin 返回 NA,如果所有并行元素都是 NA,即使是 na.rm = TRUE

    您没有任何 D 组的非 NA 值,因此 max 返回一个空集的值。

    【讨论】:

      【解决方案2】:

      迟到了,但解决方案是在没有价值最大化时返回 NA 而不是 Inf。这可以通过 hablar 包的 s 函数来完成。

      library(dplyr)
      library(hablar)
      
      VO2 %>% 
        group_by(Name, Sex) %>% 
        summarise(Best.Score = max(s(VO2)))
      

      给你:

        Name     Sex   Best.Score
        <chr>    <chr>      <int>
      1 AthleteA M             52
      2 AthleteB M             56
      3 AthleteC M             42
      4 AthleteD M             NA
      

      【讨论】:

        猜你喜欢
        • 2018-11-18
        • 2014-10-07
        • 2013-04-08
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 2013-08-06
        相关资源
        最近更新 更多