R采样命令大小不正确

时间:2015-03-23 04:31:30

标签: r

ratio[i]

[1] 0.9

length(sample(c(1,2,3,4,5,6,7,8,9),2000*ratio[i],replace=T))

[1] 1800

length(sample(c(1,2,3,4,5,6,7,8,9),2000*(1-ratio[i]),replace=T))

[1] 199

看起来R正在进行错误的计算。我尝试了几个数字,有时它是正确的,但有时它不是。所以我做了以下几点。

space<-matrix(nrow=10000,ncol=2)
for (i in 1:10000){
#expected
  space[i,1]<-20000*(1-i/10000)
#actual
  space[i,2]<-length(sample(1,20000*(1-i/10000),replace=T))

}

plot(space[,1]-space[,2])

看来这个问题不仅限于几个数字。

2 个答案:

答案 0 :(得分:1)

这是因为浮点运算不精确。如果您执行此操作,2000*(1-ratio[i])并未提供完全 200

options(digits=22)
2000*(1-ratio[i])

[1] 199.9999999999999431566

如果你2000 * (1 - 0.9),你会得到相同的结果。

sample使用size参数的底限和底面199.9999 ... 566是199.您可以将其包裹在round()中以确保获得您期望的样本大小

答案 1 :(得分:0)

似乎&#39;样本&#39;是地板&#39;地板&#39;论证&#39; size&#39;当双人通过时。

请确保您在参数&#39; size&#39;中传递一个整数。

length(sample(1:9,size=2000*(1-0.9),replace=TRUE)) # length is 199  

length(sample(1:9,size=round(2000*(1-0.9)),replace=TRUE)) # length is 200