R summary()为过多的NAs提供了不正确的值 设置
我有一个由3.5e6 1、7.5e6 0和4.4e6 NA组成的数据集。当我在上面调用R summary()为过多的NAs提供了不正确的值 设置,r,R,我有一个由3.5e6 1、7.5e6 0和4.4e6 NA组成的数据集。当我在上面调用summary()时,我得到了一个错误的平均值和最大值(与mean()和max()不一致) 单独调用mean()时,它会返回一个合理的值: > mean(data, na.rm = T) [1] 0.6804823 问题的特征 看起来这个问题对于任何包含超过3162277 NA值的向量都是通用的 就在截止线以下: > thingie <- as.numeric(c(rep(0,1e6), r
summary()
时,我得到了一个错误的平均值和最大值(与mean()
和max()
不一致)
单独调用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摘要(thingie)
最小第一个曲中位数平均第三个曲最大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摘要(thingie)
最小第一个曲中位数平均第三个曲最大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
>thingie摘要(thingie)
最小第一个曲中位数平均第三个曲最大NA's
0.0 0.2 0.5 0.5 0.8 1.0 3162277
>thingie摘要(thingie)
最小第一个曲中位数平均第三个曲最大NA's
0 0 0 0 1 1 3162278
研究
mean()
和max()
函数代替summary()
,但我很好奇是否有人知道这种行为的原因。而且,我妹妹和我都找不到关于它的任何提及,所以我想我会把它记录下来,留给子孙后代
编辑:我说的是整个帖子的平均值和最大值,但最大值很好。第一分位数、中位数和第三分位数不同。以下是一些示例数据:
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
这里的关键转折点是3162277
到3162278
NA
值,当舍入阈值超过0.5时,舍入阈值从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
dput(最大(0L,getOption(“数字”)-log10(3162277)))
#0.500000090664876
dput(最大(0升,getOption(“数字”)-log10(3162278)))
#0.499999953328896
[7]有趣的是,调整digits参数似乎没有帮助。我浏览了一些底层代码。这两个将打印底层值:print.default(summary(thingie),digits=5)
和print.table(summary(thingie),digits=5)
,尽管输出没有那么漂亮。也就是说。。。真奇怪。我没有想到这是一个打印错误。我刚刚检查过,确信,summary(thingie)[“Mean”]==Mean(thingie,na.rm=TRUE)
是真的。有趣的是,在debug(summary.default)
之后单步执行显示值的核心打印得很好(qq
对象),包括na
值的初始添加。当对象的类更改为c(“summaryDefault”,“table”)
后,一切都会出错。可能是print.summaryDefault
中的某些内容导致了该问题。
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
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