在R中实现分组变量与其余变量的交互项循环生成
生成独热编码分组与指定变量的交互项
现有如下R代码生成的数据集(实际协变量数量远多于示例):
install.packages("mltools") library(mltools) library(dplyr) set.seed(1234) data <- tibble::data_frame( age = round(runif(60, min = 48, max = 90)), gender = sample(c(0,1), replace=TRUE, size=60), weight = round(runif(60, min = 100, max = 300)), group = sample(letters[1:4], size = 60, replace = TRUE)) one_hot <- data[,c("group")] %>% glmnet::makeX() %>% data.frame() data$group <- NULL data <- cbind(data, one_hot)需要生成包含独热编码分组变量(
groupa、groupb、groupc、groupd)分别与age、gender、weight的交互项(如groupa*age、groupa*gender等)的数据框,寻求仅针对指定列生成交互项的实现方法。
方法一:Base R 循环实现
这种方法直观易懂,无需额外依赖tidyverse包:
# 自动识别独热分组列和协变量列 group_cols <- grep("^group", colnames(data), value = TRUE) covar_cols <- setdiff(colnames(data), group_cols) # 生成所有交互项的配对组合 interact_pairs <- expand.grid(group = group_cols, covar = covar_cols, stringsAsFactors = FALSE) # 循环计算并添加交互项 for (i in 1:nrow(interact_pairs)) { group_col <- interact_pairs$group[i] covar_col <- interact_pairs$covar[i] new_col_name <- paste(group_col, covar_col, sep = "*") data[[new_col_name]] <- data[[group_col]] * data[[covar_col]] }
思路
- 通过
grep自动匹配所有以group开头的独热编码列,避免手动列名输入 - 用
setdiff提取出除分组列外的所有协变量列 - 借助
expand.grid生成所有分组列与协变量列的配对 - 循环遍历每个配对,计算两列乘积并以
分组列*协变量列命名添加到数据框
方法二:tidyverse 批量处理实现
如果习惯使用tidyverse生态,可通过dplyr+purrr实现批量生成:
library(dplyr) library(purrr) library(stringr) # 定义目标列名 group_cols <- c("groupa", "groupb", "groupc", "groupd") covar_cols <- c("age", "gender", "weight") # 批量生成交互项并合并到原数据框 data_with_interactions <- data %>% mutate( across(all_of(group_cols), ~ map2(.x, data[covar_cols], `*`) %>% set_names(str_c(cur_column(), covar_cols, sep = "*")), .names = "{.col}_temp") ) %>% unnest_wider(everything(), names_sep = "") %>% select(-ends_with("_temp"))
思路
- 用
across遍历所有分组列 - 对每个分组列,通过
map2与每个协变量列执行乘积运算 - 用
set_names为交互项设置规范的列名 - 最后用
unnest_wider将嵌套的列表列展开为普通数据列,再清理临时后缀
内容的提问来源于stack exchange,提问作者R and C.F
相关产品推荐
相关产品推荐

