在R(dplyr)中拆分未知类别拼接文本列为二进制列
解决方案
可以通过tidyr和dplyr的组合操作实现需求,全程动态识别所有类别,无需提前指定列表,具体代码如下:
library(dplyr) library(tidyr) # 示例数据 df <- data.frame(id=c(1,2,3,4,5), number=c("a,b,d","e,a","c","","k,t")) # 处理流程 result <- df %>% # 将逗号分隔的类别拆分为多行 separate_rows(number, sep = ",") %>% # 过滤空字符串(处理无类别的情况) filter(number != "") %>% # 标记存在的类别为1 mutate(value = 1) %>% # 转换为宽格式,不存在的类别填充0 pivot_wider( id_cols = id, names_from = number, values_from = value, values_fill = 0 ) %>% # 确保保留所有原始ID(包括无类别的ID) right_join(df %>% select(id), by = "id") %>% # 将无类别ID对应的列填充为0 mutate(across(-id, ~replace_na(.x, 0))) %>% # 按字母顺序排列类别列(可选,让结果更整齐) select(id, sort(colnames(.)[-1])) # 输出结果 result
输出结果
id a b c d e k t 1 1 1 1 0 1 0 0 0 2 2 1 0 0 0 1 0 0 3 3 0 0 1 0 0 0 0 4 4 0 0 0 0 0 0 0 5 5 0 0 0 0 0 1 1
步骤说明
separate_rows:将每个ID对应的多类别拆分为单独行,实现从宽到长的转换。filter(number != ""):移除空字符串行,避免生成无效的空类别列。pivot_wider:将长格式转回宽格式,自动识别所有类别作为列名,用values_fill=0填充不存在的类别。right_join+replace_na:确保原始数据中所有ID都被保留,无类别ID的所有类别列统一填充为0。select(..., sort(colnames(.)[-1])):可选步骤,将类别列按字母排序,提升结果可读性。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

