Вектор элементов, которые не обновляются в цикле

#r

#r

Вопрос:

логически этот код должен иметь смысл, я в первую очередь программист на python, но я не уверен, почему это не работает. Он не возвращает никаких ошибок. Я хочу, чтобы этот вектор, состоящий в основном из нулей, был изменен на вектор, состоящий только из 1 и -1 (следовательно, с использованием функции sample). Моя проблема в том, что значения вектора не обновляются, они просто остаются равными 0, и я не уверен, почему.

 Y = numeric(100)

for (i in 100){
  x <- sample(1:2, 1)
  if (x == 2){
    Y[i] = 1
  }
  else{
    Y[i] = -1
  }
}
  

Я также изменил Y [i] = 1 на Y [i] <- 1, но это не помогло. Я также знаю, что x равно 1 или 2, потому что я тестирую его вручную, используя x == 2 … и т. Д

Единственная другая проблема, о которой я мог подумать, это то, что x является целым числом, в то время как выборки чисел не являются, но проверяют это: (Обратите внимание, что x = 2L после завершения цикла)

 > typeof(x)
[1] "integer"
> typeof(2)
[1] "double"
> x == 2
[1] TRUE
  

Я не думаю, что это проблема.
Есть предложения?

Ответ №1:

Потому что цикл выполняется только один раз, т.Е. На последней итерации. Это действительно изменилось в выходном векторе Y

 tail(Y)
#[1]  0  0  0  0  0 -1
  

Вместо этого это было бы 1:100

 for(i in 1:100)
  

Вторая проблема связана с typeof ‘x’. Здесь мы sample integer вводим with 1:2 вместо числового вектора, и он возвращает то type же самое, что и входные данные. Согласно ?':'

Для числовых аргументов — числовой вектор. Это будет иметь тип integer, если from имеет целочисленное значение, и результат может быть представлен в целочисленном типе R, в противном случае типа «double»

 typeof(1:2)
#[1] "integer"
typeof(c(1, 2))
#[1] "double"
  

Другой вариант, если это range ( : ), — обернуть с as.numeric

 for (i in 1:100){
  x <- sample(as.numeric(1:2), 1)
  if (x == 2){
    Y[i] = 1
  }
  else{
    Y[i] = -1
  }
}
  

проверьте тип

 typeof(Y)
#[1] "double"
typeof(x)
#[1] "double"
  

Комментарии:

1. боже мой … что-то такое простое … большое вам спасибо

Ответ №2:

Кроме того, R является векторизованным языком, поэтому это:

 x<-sample(1:2, 100, replace = TRUE)
Y<-ifelse(x==2, 1, -1)
  

будет выполняться примерно в 1000 раз быстрее, чем ваш цикл.