摘要函数在R中的四舍五入误差?

4

我有一个16968行的数据框(下面会解释为什么要这么多行)。我正在检查一个变量(data$Ob)是否按顺序计算每一行(第一行data$Ob是1,最后一行是16968,中间的每一行都有相应的值)。

当我运行summary(data$Ob)时,它告诉我最大值是16970而不是16968。但当我运行max(data$Ob)时,它显示最大值为16968而不是summary函数返回的值。

我运行了一个for循环来检查每个观测值,看起来max()函数是正确的,而data$Ob变量也在按照预期工作。但有没有人知道为什么summary函数会差2?我猜是舍入误差(不知何故?),但这个数据检查对我的分析至关重要,如果它错了,那么我的后续分析就毫无意义了。

这是我运行的for循环,但我认为这并不是这个问题的关键。

checker <- vector(length=nrow(rd))
na.checker <- vector(length=nrow(rd))
    for (i in 1:nrow(rd)){
        checker[i] <- ifelse(i==rd$Ob[i], 1, 0)
        na.checker[i] <- ifelse(is.na(rd$Ob[i])==TRUE,0,1)
}
sum(checker)

感谢。
1个回答

9

没有一个可重现的例子,很难判断,但这似乎是最常见的问题之一:默认显示精度为四位数字,所以16968会被四舍五入为16970。

编辑:我们需要你的样本数据,因为我无法通过简单的示例来重现这个问题:

R> set.seed(42) 
R> df <- data.frame(a=as.numeric(1:16968), b=16968:1, 
+                   c=rnorm(16968), d=runif(16968))
R> summary(df)
       a               b               c                  d           
 Min.   :    1   Min.   :    1   Min.   :-4.04328   Min.   :0.000101  
 1st Qu.: 4243   1st Qu.: 4243   1st Qu.:-0.68271   1st Qu.:0.252515  
 Median : 8484   Median : 8484   Median :-0.00528   Median :0.505090  
 Mean   : 8484   Mean   : 8484   Mean   :-0.00834   Mean   :0.504563  
 3rd Qu.:12726   3rd Qu.:12726   3rd Qu.: 0.66746   3rd Qu.:0.758991  
 Max.   :16968   Max.   :16968   Max.   : 4.32809   Max.   :0.999976  

编辑2,感谢@SimonO101提供的信息:

R> summary(df$a)                                   ## what OP saw
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1    4240    8480    8480   12700   17000 
R> summary(df$a, digits=6)                         ## what OP wanted to see
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1    4243    8484    8484   12726   16968 
R> 

+1 我以前从未知道这件事。在整数向量的摘要中具有这种奇怪的默认行为似乎有些奇怪。 - Simon O'Hanlon
太好了——谢谢Simon。我知道我自己已经看到这个东西无数次了,但它确实只被列汇总触发。我会再次编辑。 - Dirk Eddelbuettel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接