3

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

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

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

对于使用列表进行这种查找,我找不到任何适用的帮助,所以也许不建议这样做?我将非常感谢修复或替代方案。

4

3 回答 3

3

这是一个解决方案,但在分享之前,我通过添加重复的问题(“q2”)稍微修改了您的数据:

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. 这些解决方案都不会容纳重复的“q2”问题。

    > 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“question.title”列的结构(如果不使用,此解决方案也会这样做unlist),如果您尝试执行诸如将数据导出到csv 文件稍后。这特别麻烦,因为没有视觉指示结果列是 a ,但是您可以通过查看结果的 ucturelist来验证这一点。strdata.frame
于 2013-04-15T10:04:11.457 回答
0

这应该工作 -

survey.data$question.title <- titles[names(titles) %in% survey.data$question.number]
于 2013-04-15T09:47:51.897 回答
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
于 2013-04-15T09:48:33.337 回答