#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
в логическое значение. Спасибо.