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

在R dplyr中处理格式异常列,实现值计数型One-Hot编码转换

问题描述

现有一列名为col1的数据,该列首尾均以英文逗号,开头和结尾,各数值之间用两个英文逗号,,分隔,示例数据如下:

col1
,101,,9,,201,,200,
,201,,101,,102,
,9,,101,,102,,200,,201,
,101,,200,,9,,102,,102,

需要在R的dplyr工具链中,将该列转换为如下格式:以原列中的每个唯一数值作为新列名(前缀为col1_),对应行记录该数值在原行中的出现次数,目标格式示例如下:

col1_9 col1_101 col1_102 col1_200 col1_201
1      1        0        1        1
0      1        1        0        1
1      1        1        1        1
1      1        2        1        0
解决方法

可以结合dplyr和tidyr的函数完成转换,具体代码如下:

library(dplyr)
library(tidyr)

# 构造示例数据框
df <- tibble(
  col1 = c(
    ",101,,9,,201,,200,",
    ",201,,101,,102,",
    ",9,,101,,102,,200,,201,",
    ",101,,200,,9,,102,,102,"
  )
)

# 核心处理流程
result <- df %>%
  # 添加行号,用于拆分后保留行对应关系
  mutate(row_id = row_number()) %>%
  # 清理字符串并拆分:先移除首尾逗号,再按,,分割成数值列表
  mutate(values = strsplit(sub("^,|,$", "", col1), ",,")) %>%
  # 将列表列展开为长格式(每行一个数值)
  unnest(values) %>%
  # 按行号和数值分组,统计每行内各数值的出现次数
  count(row_id, values) %>%
  # 重塑为宽格式,缺失数值的计数填充为0,添加指定前缀
  pivot_wider(
    names_from = values,
    values_from = n,
    names_prefix = "col1_",
    values_fill = 0
  ) %>%
  # 移除辅助行号列
  select(-row_id)

# 查看结果
print(result)

代码分步说明

  1. 添加行号:用row_number()标记每行的唯一ID,避免拆分后丢失原始行的对应关系;
  2. 字符串清理与拆分:sub("^,|,$", "", col1)移除首尾的冗余逗号,再用strsplit按,,分割成单个数值的列表;
  3. 展开列表:unnest(values)将列表格式的数值展开为长表格,每行仅保留一个数值和对应的行号;
  4. 计数统计:count(row_id, values)统计每行中每个数值的出现次数;
  5. 格式重塑:pivot_wider将长表格转为目标宽格式,names_prefix给新列添加指定前缀,values_fill把未出现数值的计数填充为0;
  6. 清理辅助列:最后移除用于关联的row_id列,得到最终结果。

运行代码后输出的结果与需求完全匹配:

# A tibble: 4 × 5
  col1_9 col1_101 col1_102 col1_200 col1_201
   <int>    <int>    <int>    <int>    <int>
1      1        1        0        1        1
2      0        1        1        0        1
3      1        1        1        1        1
4      1        1        2        1        0

内容的提问来源于stack exchange,提问作者Eisen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:03:11