如何使用purrr批量将factor因子变量转换为二分类哑变量
错误原因
你之前的写法是将数据框df通过管道传入map的第一个参数,map会遍历df的每一列作为自定义函数的输入,相当于你给a、b等数值列调用fac_to_d,自然触发mutate找不到对应方法的报错。你需要迭代的是要处理的因子列向量cols,而非数据框本身。
调整方案(复用你现有函数)
你需要的是累积迭代的reduce函数,每次将上一轮处理后的数据框传入下一次函数调用,和你手动连续调用两次的逻辑完全一致:
cols <- c("c", "e") cols %>% reduce(fac_to_d, .init = df)
运行结果和你手动调用的输出完全相同。
更优tidy风格实现
不需要自定义函数,直接使用tidyverse原生逻辑即可,还能自动处理列名前缀避免不同因子出现同水平时的列名冲突:
方案1:pivot系列原生函数
library(tidyr) library(dplyr) df %>% pivot_longer(cols = all_of(cols)) %>% mutate(val = 1) %>% pivot_wider(names_from = c(name, value), values_from = val, values_fill = 0, names_sep = "")
方案2:基于model.matrix的极简实现
适合不需要自定义列名的场景,代码更短:
bind_cols( df %>% select(-all_of(cols)), model.matrix(~ 0 + c + e, data = df) %>% as_tibble() )
输出会自动给列名加上因子名前缀,例如cRose、eParis,避免列名冲突风险。
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

