Я хочу создать цикл, который создает новые переменные и использует значения последовательности цикла для имени этой переменной. В stata это легко сделать с помощью синтаксиса `x ', как показано ниже.
foreach x of 1 2 3 4 5 {
gen newvar_`x' = `x'*1.2
}
что даст 5 переменных с именами
newvar_1 = 1.2
newvar_2 = 2.4
newvar_3 = 3.6
newvar_4 = 4.8
newvar_5 = 6.0
Я попытался ввести следующие коды в r, чтобы сделать то же самое.
for (i in c(1,2,3,4,5)){
newvar_i <- i*1.2
}
Это создает одну переменную с именем "newvar_i" со значением 6.
И это я тоже пробовал.
for (i in c(1,2,3,4,5)){
paste("newvar_",i, sep = "") <- i*1.2
}
Что вызывает следующую ошибку
"Error in paste("newvar_", i, sep = "") <- i*1.2 :
target of assignment expands to non-language object"
Есть ли у кого-нибудь решения этой проблемы?
если вы хотите использовать for loop, вы можете эффективно использовать функцию assign. т.е. for I in ….{assign(paste0('newvar_', I,),I *1.2)}
R опирается на другую философию объектно-ориентированного программирования. Лучше ознакомиться с его соглашениями, а не пытаться напрямую переводить код Stata.
*apply для цикла и сохранения объектов в list (вместо создания нескольких объектов в вашей текущей среде). Использование assign в большинстве случаев составляет плохая идея.





Решение: (спасибо Онямбу)
for (I in c(1,2,3,4,5)){
assign(paste0('newvar_', I),I *1.2)
}
Если вы новичок в R, рассмотрите этот подход. Создайте значения в виде списка, назовите значения и назовите их, используя знак $.
myVars <- as.list(1:5 * 1.2) # creates values
names(myVars) <- paste("newvar_", 1:5, sep = "") # names values
Если вы хотите вызвать конкретное значение, вы используете имя вашего списка (myVars), знак $, а затем имя значения. Ниже возвращается значение для newvar_1
myVars$newvar_1
зачем вам это делать? Во всяком случае, сделайте
list2env(as.list(setNames(1:5*1.2,paste('newvar_',1:5))),.GlobalEnv), а теперь звонитеnewvar_1и т. д.