Пакетное переименование переменных в R без цикла For

#r #for-loop #variable-names

#r #for-цикл #имена переменных

Вопрос:

У меня есть таблица вопросов опроса:

 ques <- data.frame(stringsAsFactors=F,
         question_id=c("q1","q2"),
         question_nm=c("computer_hrs","exercise_hrs"),
         question_txt=c("How many hours did you spend last week on a computer?",
                        "How many hours did you spend last week on exercise?")
        )
  

question_nm Это строка краткого описания, уже проверенная на допустимость в качестве имени переменной.

У меня есть таблица ответов:

 resp <- data.frame(stringsAsFactors=F,
  respondent_id=c(1,2),
  respondent_nm=c("Joe Programmer","Jill Athlete"),     
  q2=c(1,100), #column order in resp not guaranteed same as row order in ques
  q1=c(100,1) 
)
  

Чтобы иметь значимые имена переменных ответа, я хочу заменить имена q1 and q2 на computer_hrs and exercise_hrs .

Обратите внимание, что вы получите неправильный ответ с:

 names(resp)[ques$question_id %in% names(resp)] <- ques$question_nm #wrong
  

из-за того, что порядок столбцов в ответах не соответствует порядку строк в вопросах. (Я знаю, что мог бы исправить это, отсортировав каждый порядок.)

Я могу сделать это с помощью цикла for…

 for (q in ques$question_id){
  names(resp)[names(resp)==q] <- ques$question_nm[ques$question_id==q]
}
  

… но учитывая функцию, которая возвращала сопоставление элементов ques $question_id с именами (соответственно), аналогично %in% , но возвращая позицию, а не T / F , я мог бы сделать это без цикла For . К сожалению, единственный известный мне способ написания этой функции включает цикл For .

Есть ли способ выполнить эту замену без цикла?

Ответ №1:

Попробуйте:

 names(resp)[match(ques[,1], names(resp))] <- ques$question_nm
  

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

1. match работает. Я знал, %in% но никогда не понимал, что это интерфейс match , который преобразует позиции, возвращаемые match в логическое значение. Спасибо.