在没有For循环的R中批量重命名变量

时间:2014-06-20 19:10:31

标签: r for-loop variable-names

我有一张调查问题表:

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) 
)

为了获得有意义的响应变量名称,我希望用q1q2替换名称computer_hrsexercise_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元素的映射返回到names(resp),类似于%in%但是返回位置而不是T / F,我可以在没有对于循环。不幸的是,我知道编写该函数的唯一方法是使用For循环。

有没有办法在没有循环的情况下完成这个替换?

1 个答案:

答案 0 :(得分:3)

尝试:

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