#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 раз быстрее, чем ваш цикл.