如何用data.table按Question_all生成记录对应Survey的found_in列
使用data.table实现按公共问题ID关联调查列表
你可以通过分组聚合+数据连接的方式快速实现需求,以下是基于data.table语法的解决方案:
完整代码
library(data.table) # 加载原始数据 dat <- fread("Survey Question_unique Question_all A 1 2 B 2 2 C 3 2 C 5 NA A 7 NA B 6 1 A 4 1") # 步骤1:按公共问题ID分组,生成对应的调查列表 survey_groups <- dat[, .(found_in = paste0(sort(unique(Survey)), collapse = ", ")), by = Question_all] # 步骤2:将分组结果合并回原始数据 dat <- dat[survey_groups, on = "Question_all"] # 步骤3:处理公共ID为NA的行,将found_in设为NA dat[is.na(Question_all), found_in := NA_character_] # 查看最终结果 print(dat)
代码说明
- 分组聚合:通过
by = Question_all分组,用unique(Survey)去重每个公共ID对应的调查,sort()保证结果按字母顺序排列(和你给出的示例输出一致),最后用paste0(..., collapse = ", ")将多个调查合并为逗号分隔的字符串。 - 数据连接:利用data.table的
on = "Question_all"实现匹配连接,让每一行都关联到所属公共ID的调查列表。 - NA值处理:针对原始数据中
Question_all为NA的行,手动将found_in设为NA,符合示例要求。
运行后输出将完全匹配你期望的结果。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

