我正在处理大量的调查回复,并尝试使用列表中存储的值进行查找(将问题标题添加到我的数据框中)。我担心我的索引会忽略一些简单但我无法实现的目标。这是一个可重复的例子:
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
你可以看到新变量没有应用查找,只是从第一个开始“导入”列表的所有值。
我无法找到任何适用于使用列表进行此类查找的帮助,所以也许这样做是不可取的?我非常感谢修复或替代方案。
答案 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")
该解决方案使用match
和unlist
。
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
这与撰写本文时已经出现的两种解决方案有何不同?
两种主要方式:
这些解决方案都不适应重复的&#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
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