R - 有些值未添加到向量中?

时间:2014-12-02 23:04:02

标签: r scripting resampling

我刚刚运行了以下代码并对结果感到困惑:

> 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?

的采样之间进行替换

1 个答案:

答案 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

(虽然循环在那一点上做得不多)。