在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)
代码分步说明
- 添加行号:用
row_number()标记每行的唯一ID,避免拆分后丢失原始行的对应关系; - 字符串清理与拆分:
sub("^,|,$", "", col1)移除首尾的冗余逗号,再用strsplit按,,分割成单个数值的列表; - 展开列表:
unnest(values)将列表格式的数值展开为长表格,每行仅保留一个数值和对应的行号; - 计数统计:
count(row_id, values)统计每行中每个数值的出现次数; - 格式重塑:
pivot_wider将长表格转为目标宽格式,names_prefix给新列添加指定前缀,values_fill把未出现数值的计数填充为0; - 清理辅助列:最后移除用于关联的
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
相关产品推荐
相关产品推荐

