2014-12-02 4 views
0

Я просто побежал следующий код и смущает результат:R - Некоторые значения не добавлены в векторе?

> 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 

я ожидал, что после того, как цикл и закончил, там должно быть 50 * 100 новых дополнений к my.vect; вместо этого есть только 3415 дополнений. Единственное объяснение, которое я могу придумать, заключается в том, что параметр replace = FALSE означает, что значения, выбранные дважды, НИКОГДА не заменяются. Если это так, как я могу изменить свой код для замены между выборками из 50?

ответ

1

R не имеет оператора приращения =+.

x =+ 1 

эквивалентно

x = (+1) 
x = 1 

Таким образом, в вашем коде, вы установите my.vect[screen], равным 1, и вы делаете это в 100 раз.

Каждый раз, когда вы устанавливаете 50 случайных индексов на 1. Объяснение с replace = F противоположно тому, что имеет смысл ... каждый раз, когда вы выбираете 50 уникальных случайных индексов, но на каждой итерации некоторые из выбранных вами индексов могут перекрываются с предыдущими выборами, поэтому вы добавляете (возможно) меньше 50 новых 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 

(хотя в этой точке петля не делает ничего хорошего).

Смежные вопросы