У меня есть таблица вопросов опроса:
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
и q2
на computer_hrs
и 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.
Есть ли способ выполнить эту замену без цикла?