R中如何基于分组_na虚拟变量高效重编码分组虚拟变量
解决方案(tidyverse向量化实现,无需硬编码列名)
直接通过动态匹配列前缀实现全数据集自动适配,代码如下:
library(tidyverse) # 提取原始数据中所有因子类型的变量名 factor_vars <- df_raw %>% select(where(is.factor)) %>% colnames() df_result <- df_dummy %>% mutate( # 批量匹配所有因子生成的虚拟变量列 across( .cols = starts_with(factor_vars), .fns = ~ { # 动态提取当前列所属的分组前缀 cur_prefix <- str_extract(cur_column(), "^[^_]+") # 匹配对应分组的NA标识列 na_col <- paste0(cur_prefix, "_na") # 符合NA条件时赋值为NA,否则保留原值 if_else(.data[[na_col]] == 1, NA_integer_, .x) } ) )
运行后输出结果如下:
| species_cat | species_dog | species_na | weight | sex_f | sex_m | sex_na |
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 3.025896 | 0 | 1 | 0 |
| 0 | 1 | 0 | 3.223064 | NA | NA | NA |
| NA | NA | NA | 5.230367 | 1 | 0 | 0 |
| 0 | 1 | 0 | 4.231511 | 1 | 0 | 0 |
| 0 | 1 | 0 | 5.819032 | 0 | 1 | 0 |
如果不需要保留xxx_na标识列,可在代码末尾追加%>% select(-ends_with("_na"))删除。
备选方案(for循环实现,可读性更强)
如果偏好循环写法,可使用以下代码实现相同效果:
df_result <- df_dummy factor_vars <- df_raw %>% select(where(is.factor)) %>% colnames() for (prefix in factor_vars) { # 匹配当前分组下的所有虚拟列 group_cols <- grep(paste0("^", prefix, "_"), colnames(df_result), value = TRUE) na_flag_col <- paste0(prefix, "_na") # 批量替换NA行 df_result[df_result[[na_flag_col]] == 1, group_cols] <- NA }
两种方案都支持任意数量的因子列自动适配,不需要修改代码即可适配新增的因子分组。
内容的提问来源于stack exchange,提问作者NorthNW
相关产品推荐
相关产品推荐

