如何将R数据框中冒号分隔的codes列转为二进制列
R数据框codes列转二进制独热编码问题
原始数据框的codes列如下:
codes 111:222:333 222 111:222
期望将其扩展为包含二进制值的独立列,格式如下:
111 222 333 1 1 1 0 1 0 1 1 0
问题分析
你尝试的代码中,unnest后丢失了原始行的对应关系,导致pivot_wider无法正确将每个codes映射回原行,从而出现重复标识的问题。解决核心是给每一行添加唯一标识,确保拆分后的codes能关联到原始行。
修正后的代码
library(tidyverse) # 假设原始数据框为df df <- tibble(codes = c("111:222:333", "222", "111:222")) df_result <- df %>% # 添加唯一行标识 mutate(row_id = row_number()) %>% # 拆分codes为字符列表 mutate(codes = strsplit(codes, ":")) %>% # 展开列表 unnest(codes) %>% # 标记存在的codes为1 mutate(value = 1) %>% # 转换为宽表,按row_id分组,缺失值填充0 pivot_wider( id_cols = row_id, names_from = codes, values_from = value, values_fill = 0 ) %>% # 移除行标识列(按需保留) select(-row_id) print(df_result)
运行后输出:
# A tibble: 3 × 3 `111` `222` `333` <dbl> <dbl> <dbl> 1 1 1 1 2 0 1 0 3 1 1 0
补充说明
- 添加
row_id是关键,它确保拆分后的每个codes都能对应到原始行,避免pivot_wider时的冲突。 - 如果原始数据框已有唯一行标识列,可直接用该列替代
row_number()生成的row_id。
内容的提问来源于stack exchange,提问作者user14140004
相关产品推荐
相关产品推荐

