【问题标题】:Standard Deviation coming up NA when using summarise() function使用 summarise() 函数时出现标准偏差 NA
【发布时间】:2018-01-04 03:11:32
【问题描述】:

我正在尝试计算 RStudio 中出生体重数据集 (birthwt) 的描述性统计数据。但是,我只对几个变量感兴趣:ageftvptllwt

这是我目前的代码:

library(MASS)
library(dplyr)
data("birthwt")

grouped <- group_by(birthwt, age, ftv, ptl, lwt)

summarise(grouped, 
          mean = mean(bwt),
          median = median(bwt),
          SD = sd(bwt))

它给了我一张印刷精美的表格,但只有有限数量的 SD 被填满,其余的说 NA。我只是不知道为什么或如何解决它!

【问题讨论】:

  • 代码中的哪个位置?
  • 原因是大多数情况下您只有一个观察值,即grouped %&gt;% summarise(n = n())sd 需要多个观察值,否则返回 NaN
  • 对不起,我不明白!
  • 可以查看?sd写成The standard deviation of a length-one vector is NA.部分组的元素个数为1。

标签: r dplyr standard-deviation


【解决方案1】:

我偶然发现这里还有另一个原因,对我来说,答案来自docs

# BEWARE: reusing variables may lead to unexpected results
mtcars %>%
    group_by(cyl) %>%
    summarise(disp = mean(disp), sd = sd(disp))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 3 x 3
#>     cyl  disp    sd
#>   <dbl> <dbl> <dbl>
#> 1     4  105.    NA
#> 2     6  183.    NA
#> 3     8  353.    NA

所以,如果有人和我有同样的原因,不要重复使用变量,而是创建新变量:

mtcars %>%
group_by(cyl) %>%
summarise(
    disp_mean = mean(disp),
    disp_sd = sd(disp)
)

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 3 x 3
    cyl disp_mean disp_sd
  <dbl>     <dbl>   <dbl>
1     4      105.    26.9
2     6      183.    41.6
3     8      353.    67.8

【讨论】:

    【解决方案2】:

    某些组的行数为 1。

    grouped %>% 
         summarise(n = n())
    # A tibble: 179 x 5
    # Groups: age, ftv, ptl [?]
    #     age   ftv   ptl   lwt     n
    #   <int> <int> <int> <int> <int>
    # 1    14     0     0   135     1
    # 2    14     0     1   101     1
    # 3    14     2     0   100     1
    # 4    15     0     0    98     1
    # 5    15     0     0   110     1
    # 6    15     0     0   115     1
    # 7    16     0     0   110     1
    # 8    16     0     0   112     1
    # 9    16     0     0   135     2
    #10    16     1     0    95     1
    

    根据?sd

    长度为一的向量的标准差为 NA。

    这导致sdNA 值只有一个元素

    【讨论】:

    • 如果我使用了 4 个变量,怎么只有一个元素?
    • @Angus 您按birthwt, age, ftv, ptl, lwt 分组,其中一些组只有一个组合。您可能需要重新访问要分组的变量。我认为这就是问题所在。看起来lwt 具有唯一值,可以在分组中省略
    • 所以我实际上无法获得那些 NA 的标准偏差值?
    • @Angus 没有 NA 值。只是每组只有一个观察值。如果您想将其更改为某些值,您可以使用if/else 条件,即summarise(grouped, mean=mean(bwt), median=median(bwt), SD= if(n()&gt;1) sd(bwt) else 0),但我不确定这是否有意义
    • 虽然 n() > 1,但我遇到了同样的问题。我认为这是一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多