R语言:如何拆分多答案列并将唯一答案替换为Other
处理Data.table多答案列的低频替换与拆分方案
示例输入数据
假设你的data.table结构如下(逗号分隔多答案):
library(data.table) dt <- data.table( ID = 1:5, "Mult answ - Favorite Fruits" = c("Apple,Banana", "Orange", "Apple,Mango", "Banana", "Mango") )
步骤1:替换低频(仅出现1次)答案为Other
先拆分多答案列统计全局频率,再替换低频选项:
# 定位所有含"Mult answ"的列 mult_col <- grep("Mult answ", names(dt), value = TRUE) # 拆分成行级数据统计频率 dt_long <- dt[, strsplit(get(mult_col), ","), by = ID] setnames(dt_long, "V1", "answer") freq <- dt_long[, .N, by = answer] # 标记需替换的低频选项 low_freq <- freq[N <= 1, answer] # 替换并合并回原表 dt_long[answer %in% low_freq, answer := "Other"] dt[, updated_ans := dt_long[, paste(unique(answer), collapse = ","), by = ID]$V1]
步骤2:拆分答案为带通用后缀的独立列
将更新后的答案拆分为二进制标识列(1=选中,0=未选中),后缀用_selected:
# 获取所有唯一选项(含Other) unique_ans <- unique(dt_long$answer) # 生成独立列 for(ans in unique_ans){ dt[, paste0(ans, "_selected") := as.integer(grepl(ans, updated_ans))] } # 清理中间列(可选) dt[, updated_ans := NULL]
最终输出
运行后得到的结果如下:
> dt ID Mult answ - Favorite Fruits Apple_selected Banana_selected Orange_selected Other_selected 1: 1 Apple,Banana 1 1 0 0 2: 2 Orange 0 0 1 0 3: 3 Apple,Mango 1 0 0 1 4: 4 Banana 0 1 0 0 5: 5 Mango 0 0 0 1
注意事项
- 若多答案用其他分隔符(如分号),修改
strsplit的第二个参数即可 - 可自定义独立列的后缀,比如把
_selected改成_present - 若需保留替换后的多答案文本,不要删除
updated_ans列
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

