R语言如何从三个年度数据框提取表述变更的调查问卷题目
多年度问卷题目表述变更匹配方案
实现思路
不要硬套anti_join()处理三表关联场景,直接通过「列重命名+全连接+差异判断」三步就能实现需求,逻辑更简单,也不会丢失题项:
- 先给每个年份数据框的题目表述列重命名为对应年份,避免合并时列名冲突
- 以题号
V1为关联键,对三个年份的数据做全连接,把同一题号三年的表述整合到同一行 - 新增标记列判断题目的表述是否在三年间发生过变化,按需筛选出变更过的题目即可
可复现代码
首先修正你提供的示例数据里的语法错误(原代码存在字符串引号未闭合的问题):
# 加载数据处理包 library(dplyr) # 修正后的示例数据 df_2019 <- data.frame( V1 = c("Q1","Q2"), V2 = c("How many times have you done this?", "Is this your first time?") ) df_2020 <- data.frame( V1 = c("Q1","Q2"), V2 = c("How many times have you done this? (before this time)", "Is this your first time?") ) df_2021 <- data.frame( V1 = c("Q1","Q2"), V2 = c("How many times have you done this( before this time)?", "Is this your first time?") ) # 重命名各表的表述列,对应年份作为列名 df_2019 <- df_2019 %>% rename(`2019` = V2) df_2020 <- df_2020 %>% rename(`2020` = V2) df_2021 <- df_2021 %>% rename(`2021` = V2) # 按题号全连接合并三年数据 merged_result <- df_2019 %>% full_join(df_2020, by = "V1") %>% full_join(df_2021, by = "V1") %>% # 新增变更标记 mutate( 表述是否变更 = ifelse(`2019` == `2020` & `2020` == `2021`, "否", "是") ) # 筛选出仅发生过表述变更的题目,和你预期输出完全一致 changed_question <- merged_result %>% filter(表述是否变更 == "是")
方案说明
- 输出的
changed_question仅保留Q1,同时展示2019、2020、2021三年的不同表述,和你给出的预期结果完全匹配;Q2因为三年表述完全一致,不会出现在筛选结果中。 - 如果需要查看所有题目的变更情况,直接使用
merged_result即可,所有题号、三年表述、变更标记都会完整保留。 - 不推荐用
anti_join()的原因:该函数仅能返回左表中在右表无匹配的行,三表循环调用只能逐次找两年间不匹配的题,无法直接把三年的表述同步拼接到同一行,后续还需要额外做匹配操作,步骤冗余且容易丢题。全连接的方式即使遇到某年份缺失某道题的情况,也会自动留空,稳定性更好。
内容的提问来源于stack exchange,提问作者beevis
相关产品推荐
相关产品推荐

