R цикл изменения имен переменных - PullRequest
0 голосов
/ 24 августа 2018

Просматривал несколько постов на эту тему, но все никак не мог разобраться.Думаю, я просто попросил бы:

Я написал цикл for:

for (i in 0:5) {
     est16_y2016$pov50_[i] <- est16_y2016$pop[i]*est16_y2016$ITPR_0.5
               }

, чтобы получить те же результаты, что и следующий код:

 est16_y2016$pov50_0 <- est16_y2016$pop0 * est16_y2016$ITPR_0.5
 est16_y2016$pov50_1 <- est16_y2016$pop1 * est16_y2016$ITPR_0.5
 est16_y2016$pov50_2 <- est16_y2016$pop2 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_3 <- est16_y2016$pop3 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_4 <- est16_y2016$pop4 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_5 <- est16_y2016$pop5 * est16_y2016$ITPR_0.5 

Нопетля не работает.Нет сообщения об ошибке, новые переменные тоже не генерируются.Помогите!Благодарю.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Хотя конструкция data$column_name очень удобна в интерактивном сеансе R, при программировании это может вызвать некоторые проблемы. @ Комментарий А.Сулимана представляет способ решения этих проблем, вот еще один.

for(i in 0:5){
    target <- paste("pov50", i, sep = "_")
    pop <- paste0("pop",i)
    est16_y2016[[target]] <- est16_y2016[[pop]]*est16_y2016[["ITPR_0.5"]]
}
0 голосов
/ 25 августа 2018

Создать новую переменную легко с помощью paste (), и проблема в том, как использовать соответствующую переменную вместо имени переменной.

  for (i in 0:5){ 
    # Create new variable names
    pov.name = paste0("est16_y2016$pov50_",i)
    pop.name = paste0("est16_y2016$pop",i)

    assign(pov.name,eval(parse(text = pop.name))*est16_y2016$ITPR_0.5)
    }

В этом коде

eval(parse(text = pop.name) использует строку "pop.name" в качестве имени переменной

assign(pov.name,value1) создаетпеременная с именем pov.name и присваивает значение1 pov.name

Таким образом, вы можете получить шесть новых переменных без использования фрейма данных.

0 голосов
/ 24 августа 2018

Трудно ответить на ваш вопрос без воспроизводимого примера, но я сделаю попытку.est16_y2016$pop[i] даст вам i-й элемент est16_y2016 $ pop (который, вероятно, даже не существует. Вместо этого вы хотите est16_y2016[paste0("pop",i)], поэтому ваш код должен выглядеть следующим образом:

for (i in 0:5) 
    {
     est16_y2016[[paste0("pov50_",i)]] <- est16_y2016[[paste0("pop",i)]]*est16_y2016$ITPR_0.5
     }

(изм)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...