对于大数据集,R和Excel之间缺乏可重复性

时间:2014-03-19 06:47:56

标签: r excel floating-accuracy approximation

我在RStudio和Excel 2011 for Mac OS X上运行R版本3.0.2。我正在执行4组45,015值之间的分位数归一化。是的我知道bioconductor包,但我的问题更为笼统。它可以是任何其他计算。问题是,当我在Excel中“手动”执行计算(1)和(2)我在R中从头开始编写的程序时,我得到高度相似但不完全相同的结果。通常,用(1)和(2)获得的值相差小于1.0%,尽管有时更多。

这种变化可能来自何处,我应该注意哪些与R和/或Excel中的数字近似有关?这是否来自其中任何一个程序中缺乏浮动精度?我怎么能避免这个?

[编辑] 正如评论中向我建议的那样,这可能是特定于案例的。为了提供一些上下文,我使用9行的测试数据详细描述了下面的方法(1)和(2)。这四个数据集称为A,B,C,D。

[编辑后评论] 当我在一个非常小的数据集(测试样本:9行)上执行此操作时,R和Excel中的结果没有差异。但是当我将相同的代码应用于实际数据(45,015行)时,R和Excel之间会略有不同。我不知道为什么会这样。

(2)R代码:

数据框A

Aindex          A 
     1 2.1675e+05 
     2 9.2225e+03  
     3 2.7925e+01  
     4 7.5775e+02  
     5 8.0375e+00 
     6 1.3000e+03 
     7 8.0575e+00
     8 1.5700e+02
     9 8.1275e+01

数据框B

Bindex          B
     1 215250.000
     2  10090.000
     3     17.125
     4    750.500
     5      8.605 
     6   1260.000 
     7      7.520 
     8    190.250
     9     67.350 

数据框C

Cindex          C 
     1 2.0650e+05 
     2 9.5625e+03 
     3 2.1850e+01 
     4 1.2083e+02  
     5 9.7400e+00   
     6 1.3675e+03
     7 9.9325e+00
     8 1.9675e+02
     9 7.4175e+01

数据框D

Dindex           D 
     1 207500.0000
     2   9927.5000
     3     16.1250
     4    820.2500
     5     10.3025
     6   1400.0000
     7    120.0100
     8    175.2500
     9     76.8250

代码:

#re-order by ascending values
A <- A[order(A$A),, drop=FALSE]
B <- B[order(B$B),, drop=FALSE]
C <- C[order(C$C),, drop=FALSE]
D <- D[order(D$D),, drop=FALSE]
row.names(A) <- NULL
row.names(B) <- NULL
row.names(C) <- NULL
row.names(D) <- NULL

#compute average
qnorm <- data.frame(cbind(A$A,B$B,C$C,D$D))
colnames(qnorm) <- c("A","B","C","D")
qnorm$qnorm <- (qnorm$A+qnorm$B+qnorm$C+qnorm$D)/4

#replace original values by average values
A$A <- qnorm$qnorm
B$B <- qnorm$qnorm
C$C <- qnorm$qnorm
D$D <- qnorm$qnorm

#re-order by index number
A <- A[order(A$Aindex),,drop=FALSE]
B <- B[order(B$Bindex),,drop=FALSE]
C <- C[order(C$Cindex),,drop=FALSE]
D <- D[order(D$Dindex),,drop=FALSE]
row.names(A) <- NULL
row.names(B) <- NULL
row.names(C) <- NULL
row.names(D) <- NULL

(1)Excel

  1. 为每个集合分配索引号。
  2. Excel-step1

    1. 按升序重新排序每个集合:逐个选择列,并按A,B,C或D使用Custom Sort...
    2. Excel-step2

      1. 在A,B,C和D列上计算average=()
      2. Excel-step3

        1. 使用average&gt;用Special Paste...列中的值替换A,B,C和D列中的值Values
        2. Excel-step4

          1. 根据原始索引号重新排序所有内容:
          2. Excel-step5

2 个答案:

答案 0 :(得分:2)

如果您使用完全相同的算法,您将获得完全相同的结果。不在1%之内,而是在小数点后10位。所以你没有使用相同的算法。细节可能不会改变这个一般性答案。

(或者它可能是excel或r中的错误,但这不太可能)

答案 1 :(得分:2)

回答我自己的问题!

它最终成为Excel的错(好吧,有点):在某些时候,无论是从原始的TAB分隔文件转换为CSV,还是稍后当我开始复制和粘贴东西时,这些值被四舍五入

原始的TAB分隔文件有6个小数,而CSV文件只有2个。到目前为止,我一直在进行分析,在Excel中从6位十进制数据中进行分位数归一化,而我从CSV读取数据我的分位数归一化函数的文件在R中,因此发生了变化。

对于R和Excel的上述示例,我使用了来自同一来源的数据,这就是我得到相同结果的原因。

你认为现在我认为最好的是: 1 /改变标题让其他无知的人知道这种事情会发生吗? 2 /考虑这个帖子没用并删除它?

相关问题