使用dplyr对多选问卷二进制编码列重编码并按问题合并选项
实现方案
以下代码可以直接运行在你提供的模拟数据集上,一步得到目标结果:
library(dplyr) library(tidyr) library(stringr) # 接你原有的模拟数据生成代码后运行 result <- df %>% # 给每一行添加受访者编号,对应示例中的5位受访者 mutate(resp_id = row_number()) %>% # 宽表转长表,把所有问卷题目的二进制列转成键值对 pivot_longer(cols = starts_with("foo"), names_to = "var", values_to = "selected") %>% # 拆分变量名得到问题名称和对应选项 mutate( question = str_replace(var, "_[A-F]$", ""), option = str_sub(var, -1) ) %>% # 只保留选中(值为1)的记录 filter(selected == 1) %>% # 按受访者和问题分组,拼接选中的选项 group_by(resp_id, question) %>% summarise(options = str_flatten(option), .groups = "drop") %>% # 转成宽表,每行一个问题,每列一个受访者,和示例输出格式一致 pivot_wider(names_from = resp_id, values_from = options, values_fill = "")
运行后打印result即可得到你要求的输出:
# A tibble: 4 × 6 question `1` `2` `3` `4` `5` <chr> <chr> <chr> <chr> <chr> <chr> 1 foo_1 D ADF D BD ABF 2 foo_2 ACDE ABCDF DEF ABCEF BC 3 foo_3a BCDEF ABCDE AF AB ABDF 4 foo_3b CF CF ABCD ABEF EF
如果需要将拼接结果作为新列追加到原数据集,只需要修改最后一步的pivot_wider参数,将names_from = resp_id改为names_from = question,再通过resp_id和原表做关联即可。
内容的提问来源于stack exchange,提问作者jatx50
相关产品推荐
相关产品推荐

