Пакетное переименование переменных в 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 и 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.

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


person C8H10N4O2    schedule 20.06.2014    source источник


Ответы (1)


Пытаться:

names(resp)[match(ques[,1], names(resp))] <- ques$question_nm
person akrun    schedule 20.06.2014
comment
match работает. Я знал о %in%, но никогда не осознавал, что это интерфейс match, который преобразует позиции, возвращаемые match, в логические значения. Спасибо. - person C8H10N4O2; 21.06.2014