基于Flag标记反转fastDummies虚拟变量的tidyverse实现方案咨询
使用tidyverse实现虚拟变量的条件反转
需求说明
已通过fastDummies工具为字符型变量Var_1和Var_2生成对应虚拟变量列,需根据Flag1和Flag2的值对虚拟变量做条件反转:
- 当
Flag1 = 1时,反转所有Var_1_前缀的虚拟变量(0与1互换) - 当
Flag2 = 1时,反转所有Var_2_前缀的虚拟变量
解决方案代码
结合tidyverse的mutate_at函数可简洁实现该逻辑,完整代码如下:
list.of.packages <- c("data.table", "tidyverse", "stringr","janitor","fastDummies") new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] if (length(new.packages)) install.packages(new.packages) lapply(list.of.packages, require, character.only = TRUE) # 生成原始数据及虚拟变量 df = data.frame(PID = c(0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001), Flag1 = c(0,0,1,0,0,0,0,1,0,0,0,1,0), Flag2 = c(0,0,0,0,0,1,0,0,0,1,0,0,0), Var_1 = c("AB","CD","EF","GH","IJ","KL","MN","OP","QR","ST","UV","WX","YZ"), Var_2 = c("AB","CD","EF","GH","IJ","KL","MN","OP","QR","ST","UV","WX","YZ")) df <- dummy_cols(df, select_columns = "Var_1", remove_selected_columns=FALSE, omit_colname_prefix=FALSE) df <- dummy_cols(df, select_columns = "Var_2", remove_selected_columns=FALSE, omit_colname_prefix=FALSE) # 条件反转虚拟变量 df <- df %>% mutate_at(vars(matches("^Var_1_")), ~ ifelse(Flag1 == 1, 1 - ., .)) %>% mutate_at(vars(matches("^Var_2_")), ~ ifelse(Flag2 == 1, 1 - ., .))
代码解释
vars(matches("^Var_1_")):通过正则匹配选中所有以Var_1_开头的虚拟变量列~ ifelse(Flag1 == 1, 1 - ., .):对选中列,判断Flag1是否为1,若是则用1 - 当前值实现0、1反转,否则保留原数值- 同理处理
Var_2_前缀的列,对应Flag2的判断逻辑
执行后的数据将完全符合目标效果,无需额外编写复杂函数或循环。
内容的提问来源于stack exchange,提问作者TDeramus
相关产品推荐
相关产品推荐

