如何在tidyverse中拆分多值颜色列并生成哑变量列
当然有!在tidyverse里可以通过几个函数的组合轻松实现这个需求,而且你已经准备好完整的颜色列表df_colors,这刚好能帮我们确保所有颜色都被纳入结果中(哪怕某些颜色在原始数据里没出现,这在业务场景里非常实用)。
实现步骤与代码
我们的核心思路是:先把分隔的颜色拆分为多行,再补全每个item对应的所有颜色,最后转换为宽格式的二进制矩阵。
library(tidyverse) # 1. 拆分颜色列为单行,同时标记存在的颜色为1 df_split <- df %>% separate_rows(colors, sep = " / ") %>% mutate(value = 1L) # 2. 补全每个item的所有颜色(从df_colors获取),缺失的颜色填0,再转宽格式 df_result <- df_split %>% complete(item, colors = df_colors$color, fill = list(value = 0L)) %>% pivot_wider(names_from = colors, values_from = value) # 验证结果是否和期望一致 all_equal(df_result, df_desired) #> [1] TRUE
函数解释
separate_rows():把colors列中用" / "分隔的字符串拆分成单独的行,每个颜色对应一行;complete():强制每个item都匹配df_colors里的所有颜色,缺失的组合会自动生成行,fill参数指定这些缺失行的value为0;pivot_wider():把长格式数据转换为宽格式,颜色名称作为列名,value列的1/0作为单元格值。
这个方法在颜色数量很多的业务场景下依然高效,因为tidyverse的这些函数都是针对数据处理优化过的。
内容的提问来源于stack exchange,提问作者Jeremy K.
相关产品推荐
相关产品推荐

