You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:00:23