安装程序
我有一个由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