如何在R语言中合并数据框的多选项答案列并分析组合
解决方案
方法一:基础R实现
直接用apply()逐行遍历,提取对应值为"1"的列名,再用paste()拼接成指定格式:
# 原始数据 df <- data.frame( ID = c("001", "002", "003", "004", "005", "006"), Answer_1 = c("1", "1", "0", "0", "1", "0"), Answer_2 = c("1", "0", "1", "0", "0", "1"), Answer_3 = c("1", "1", "0", "1", "0", "1"), stringsAsFactors = FALSE ) # 生成Answer_4列 df$Answer_4 <- apply(df[, -1], 1, function(x) { paste(names(x)[x == "1"], collapse = " | ") }) # 查看结果 df
注:你给出的目标结果中ID001的Answer_4存在笔误,原始数据里该ID的三个选项均为选中状态,实际生成的结果应为Answer_1 | Answer_2 | Answer_3。
方法二:tidyverse 框架实现
用dplyr+tidyr的组合,逻辑更清晰,适合后续扩展分析:
library(dplyr) library(tidyr) library(stringr) df1 <- df %>% pivot_longer(cols = starts_with("Answer_"), names_to = "Answer", values_to = "Value") %>% filter(Value == "1") %>% group_by(ID) %>% summarise(Answer_4 = str_c(Answer, collapse = " | "), .groups = "drop") %>% right_join(df, by = "ID") %>% select(ID, Answer_1, Answer_2, Answer_3, Answer_4) df1
该方法先将宽表转为长表,筛选出选中的选项,再按ID分组拼接,最后合并回原表,便于后续添加更多统计逻辑。
方法三:data.table 高效实现
如果处理大数据集,data.table的速度优势更明显:
library(data.table) setDT(df) df[, Answer_4 := paste(names(.SD)[.SD == "1"], collapse = " | "), by = ID, .SDcols = starts_with("Answer_")] df
.SDcols指定要处理的列,按ID分组后逐行拼接符合条件的列名,执行效率远高于基础R方法。
后续分析建议
生成Answer_4列后,可通过以下代码快速做描述统计:
# 统计各组合的出现次数 df %>% count(Answer_4) # 计算各组合的占比 df %>% count(Answer_4) %>% mutate(ratio = n / sum(n))
内容的提问来源于stack exchange,提问作者snailwhale
相关产品推荐
相关产品推荐

