R summary()为过多的NA提供了不正确的值

安装程序

我有一个由3.5e6 1,7.5e6 0和4.4e6 NA组成的数据集.当我对它调用summary()时,我得到一个错误的均值和最大值(与mean()和max()不一致).

> summary(data, digits = 10)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
 0       0       1       1       1       1 4365239 

当单独调用mean()时,它返回一个合理的值:

> mean(data, na.rm = T)
[1] 0.6804823

表征问题

看起来这个问题对于任何具有超过3162277 NA值的向量来说都是通用的.

刚刚截止:

> thingie <- as.numeric(c(rep(0,1e6), rep(1,1e6), rep(NA,3162277)))
> summary(thingie)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    0.0     0.0     0.5     0.5     1.0     1.0 3162277 

刚刚结束:

> thingie <- as.numeric(c(rep(0,1e6), rep(1,1e6), rep(NA,3162278)))
> summary(thingie)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      0       0       0       0       1       1 3162278 

似乎有多少非缺失值也没关系.

> thingie <- as.numeric(c(rep(0,1), rep(1,1), rep(NA,3162277)))
> summary(thingie)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    0.0     0.2     0.5     0.5     0.8     1.0 3162277 
> thingie <- as.numeric(c(rep(0,1), rep(1,1), rep(NA,3162278)))
> summary(thingie)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      0       0       0       0       1       1 3162278 

研究

>在搜索答案时,我遇到了众所周知的舍入错误,但这不会影响此行为(请参阅第一个代码块).
>我认为这可能是我的环境/机器/行星对齐的某种奇怪的怪癖,所以我让我的妹妹运行相同的代码.她在她的机器上得到了相同的结果.

闭幕致辞

显然,这不是一个关键问题,因为可以使用mean()和max()函数代替summary(),但我很好奇是否有人知道导致这种行为的原因.此外,我的妹妹和我都没有找到任何提及它,所以我想我会为后代记录它.

编辑:我说的是整个帖子的平均值和最大值,但最大值很好.第1分位数,中位数和第3分位数不同.

最佳答案 这是一些示例数据:

x <- rep(c(1,0,NA), c(3.5e6,7.5e6,4.4e6))
out <- summary(x)
out
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#    0       0       0       0       1       1 4400000

mean(x, na.rm=TRUE)
#[1] 0.3181818

这个问题可以追溯到zapsmall(),因为它在一行基本上做了一些舍入:

c(out)
#      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
# 0.000e+00 0.000e+00 0.000e+00 3.182e-01 1.000e+00 1.000e+00 4.400e+06

round(c(out), max(0L, getOption("digits")-log10(4400000)))
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#    0       0       0       0       1       1 4400000 

这里的关键转折点是3162277到3162278 NA值,它在0.5到1时将舍入阈值从0提示到1.

dput(max(0L,getOption("digits")-log10(3162277)))
#0.500000090664876

dput(max(0L,getOption("digits")-log10(3162278)))
#0.499999953328896

out[7] <- 3162277
out
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#    0.0     0.0     0.0     0.3     1.0     1.0 3162277 

out[7] <- 3162278
out
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#      0       0       0       0       1       1 3162278
点赞