使用R列表进行查找

时间:2013-04-15 09:40:01

标签: r

我正在处理大量的调查回复,并尝试使用列表中存储的值进行查找(将问题标题添加到我的数据框中)。我担心我的索引会忽略一些简单但我无法实现的目标。这是一个可重复的例子:

survey.data <- data.frame(
  question.number = c("q2","q3","q4","q5")
)

titles <- list(q1="question1", 
           q2="question2", 
           q3="question3", 
           q4="question4", 
           q5="question5")

在一些涉及删除一些问题的数据操作之后,我尝试在我的数据框中创建一个新的question.title变量,使用下面的列表索引来引入正确的标题:

survey.data$question.title <- titles[survey.data$question.number]

给出输出:

    question.number question.title
1   q2  question1
2   q3  question2
3   q4  question3
4   q5  question4

你可以看到新变量没有应用查找,只是从第一个开始“导入”列表的所有值。

我无法找到任何适用于使用列表进行此类查找的帮助,所以也许这样做是不可取的?我非常感谢修复或替代方案。

3 个答案:

答案 0 :(得分:3)

这是一个解决方案,但在分享之前,我通过添加重复的问题(&#34; q2&#34;)来修改您的数据:

survey.data <- data.frame(
  question.number = c("q2","q3","q4","q5", "q2")
)

titles <- list(q1="question1", 
               q2="question2", 
               q3="question3", 
               q4="question4", 
               q5="question5")

该解决方案使用matchunlist

survey.data$question.title <- unlist(titles[match(survey.data$question.number, 
                                                  names(titles))])
survey.data
#   question.number question.title
# 1              q2      question2
# 2              q3      question3
# 3              q4      question4
# 4              q5      question5
# 5              q2      question2

这与撰写本文时已经出现的两种解决方案有何不同?

两种主要方式:

  1. 这些解决方案都不适应重复的&#34; q2&#34;题。

    > survey.data$question.title <- titles[names(titles) %in% survey.data$question.number]
    Error in `$<-.data.frame`(`*tmp*`, "question.title", value = list(q2 = "question2",  : 
      replacement has 4 rows, data has 5
    > survey.data$question.title <- titles[levels(survey.data$question.number)]
    Error in `$<-.data.frame`(`*tmp*`, "question.title", value = list(q2 = "question2",  : 
      replacement has 4 rows, data has 5
    
  2. 其他两个解决方案都保留了list结构,用于&#34; question.title&#34;如果您尝试执行稍后将数据导出到csv文件之类的操作,那么该列(如果不是unlist的使用那么该解决方案也会这样做)。它特别麻烦,因为没有直观的迹象表明生成的列是list,但您可以通过查看生成的str的{​​{1}}来验证这一点。

答案 1 :(得分:0)

这应该有效 -

survey.data$question.title <- titles[names(titles) %in% survey.data$question.number]

答案 2 :(得分:0)

我认为您需要列表中的级别,如下所示:

> survey.data$question.title <- titles[levels(survey.data$question.number)]
> survey.data
  question.number question.title
1              q2      question2
2              q3      question3
3              q4      question4
4              q5      question5