我刚刚运行了以下代码并对结果感到困惑:
> N = 6000
> my.vect = numeric(N)
> sum(my.vect[1:6000])
> for ( i in 1:100)
+ {
+ screen = sample(6000, 50, replace=FALSE)
+ my.vect[screen] =+ 1
+ }
> sum(my.vect[1:6000])
[1] 3415
我预计在for循环结束后,my.vect应该有50 * 100个新增内容;相反,只有3415个添加。我能想到的唯一解释是设置replace = FALSE意味着选择的值永远不会被替换。如果是这种情况,我如何修改我的代码以在50?
的采样之间进行替换答案 0 :(得分:1)
R没有=+
增量运算符。
x =+ 1
相当于
x = (+1)
x = 1
因此,在您的代码中,您将my.vect[screen]
设置为等于1,然后执行100次。
每次,您将50个随机索引设置为1.您对replace = F
的解释与有意义的相反...每次选择50个唯一随机索引,但在每次迭代中一些索引你选择的可能与以前的选择重叠,所以每次添加(可能)少于50 new 1。
如果你做一个较小的例子并跟踪每次迭代,就可以很容易地看到这一点。我已经在下面做了,每次迭代都是一行矩阵:
N = 20
k = 10
my.mat = matrix(0, nrow = k, ncol = N)
my.mat
set.seed(47)
for (row in 1:k) {
screen = sample(N, 4, replace=FALSE)
my.mat[row, screen] = 1
}
my.mat
colSums(my.mat) # you can see that many indices were chosen multiple times
# but if you used my random seed, one column was never chosen
# your final result from above is equivalent to
colSums(my.mat) > 0
我不清楚你想做什么。
如果你的目标是增加,你可以像我一样在矩阵中使用colSums
,或者你可以
设置
my.vect[screen] = my.vect[screen] + 1
如果您想每次选择不同的值,请在循环前预先进行所有采样
screen = sample(6000, 50 * 100, replace = FALSE)
然后在你的循环中使用
my.vect[screen[ seq(50 * (i - 1) + 1, 50 * i) ]] = 1
(虽然循环在那一点上做得不多)。