You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:18:20