R summary()为过多的NAs提供了不正确的值 设置

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

我有一个由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), 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