我正在尝试处理R中的百分比,我遇到了奇怪的问题。当我将向量的值转换为向量的sum
的百分比时,经常发生这种情况,它们不会加起来。
最小例子:
data <- rnorm(1000)*100
max <- 50
unlist(lapply(0:(1000/max-1),
function(i)
sum(
data[(i*max+1):(i*(max+1))]
/
sum(data[(i*max+1):(i*(max+1))])
)
))-1
它应该给出零的向量,但是我得到了这个:
[1] 0.000000e+00 0.000000e+00 -1.110223e-16 -1.110223e-16 0.000000e+00 -1.110223e-16 0.000000e+00 0.000000e+00 0.000000e+00
[10] 0.000000e+00 0.000000e+00 2.220446e-16 0.000000e+00 -4.440892e-16 0.000000e+00 0.000000e+00 0.000000e+00 4.440892e-16
[19] -1.110223e-16 0.000000e+00
有任何补救措施吗?
答案 0 :(得分:4)
他们被一个微不足道的数字所取代。如果要更改浮点运算中固有的这些无关紧要的差异的显示方式,可以使用格式函数或其中一个类似sprintf或formatC的表兄弟。这实际上是FAQ 7.31.的一个实例。如果您确实需要格式化方面的帮助,您应该描述一个特定的应用程序。如果你想强迫看到零,你也可以使用round()
round( unlist(lapply(0:(1000/max-1),
function(i)
sum(
data[(i*max+1):(i*(max+1))]
/
sum(data[(i*max+1):(i*(max+1))])
)
))-1 , digits=4)
答案 1 :(得分:4)
更重要的问题是为什么你认为这些应该是0
?
您正在使用浮点运算,并非所有数字都可以在您的计算机中准确表示。这涵盖(或与R FAQ 7.31相关,这解释了这种现象。
您可以忽略它(对于所有意图和目的,这些值都是0
)
> all.equal(tmp, rep(0, length(tmp))) ## tmp contain your numbers
[1] TRUE
或学会根据您的特定操作进行相应处理。一种方法是在某种程度上围绕它们:
> round(tmp, 2)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 3)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 4)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> round(tmp, 5)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
但这取决于你想对这些数字做什么。