R长表数据多选项重复响应合并适配pivot_wider的实现问题
R语言多选题响应拼接与宽表转换解决方案
核心实现逻辑
核心需求是将同一受访者同一问题下的多个多选题响应合并,只需按受访者ID、问题两个维度分组后拼接响应即可,完全不需要依赖行号,适配每月更新的动态数据。
示例数据运行代码
步骤1:加载依赖与构造示例数据
library(tidyverse) # 构造你提供的测试数据 test_df <- tibble( ID = c(1,1,2,2,3,3,4), Question = c("question 1", "question 2", "question 1", "question 2", "question 1", "question 1", "question 1"), Response = c("affiliation x", "course 1", "affiliation y", "course 1", "affiliation x", "affiliation z", "affiliation y") )
步骤2:生成长表处理结果(符合你要求的中间输出)
processed_long <- test_df %>% # 按ID和问题双维度分组,确保同一个人同个问题的响应归为同一组 group_by(ID, Question) %>% # 多个响应用逗号+空格拼接,若需要去重可改为 str_c(unique(Response), collapse = ", ") summarize(Response = str_c(Response, collapse = ", "), .groups = "drop")
运行后输出的长表和你期望的结果完全一致,可直接用于后续宽表转换。
步骤3:直接转换为宽表(可选,一步完成)
如果不需要中间长表,可直接链式调用转宽表函数:
processed_wide <- test_df %>% group_by(ID, Question) %>% summarize(Response = str_c(Response, collapse = ", "), .groups = "drop") %>% pivot_wider( id_cols = ID, names_from = Question, values_from = Response )
适配你的业务数据的修正代码
你之前代码的主要错误点:
str_c("Response Text", ...)给字段名加了引号,变成拼接固定字符串而非取字段值- aggregate公式写反,分组维度不全
修正后的业务代码如下:
library(tidyverse) course1 <- all_surveys %>% # 过滤指定问卷 filter(`Survey Title` == "course 1") %>% # 按用户ID、问题、响应日期分组(若不需要按日期区分可删除`Response Date`分组项) group_by(`User ID`, Question, `Response Date`) %>% # 拼接响应,需要去重则加unique:str_c(unique(`Response Text`), collapse = ", ") summarize(`Response Text` = str_c(`Response Text`, collapse = ", "), .groups = "drop") %>% # 转换为宽表 pivot_wider( id_cols = c(`User ID`, `Response Date`), names_from = Question, values_from = `Response Text` ) %>% # 替换为你需要保留的问题列名即可 select(`User ID`, `Response Date`, 问题1, 问题2, 问题3)
内容的提问来源于stack exchange,提问作者Kayci Muirbrook
相关产品推荐
相关产品推荐

