如何在map()中使用modelr::formulas()生成分组专属回归公式?
解决方法
问题出在你直接在as.formula()中嵌套了str_c(),as.formula()不会解析字符串拼接函数,只会把它当作公式的字面部分。正确的做法是先完成字符串拼接,再将完整的字符串转为公式。
方法一:用purrr::map循环生成
library(purrr) library(stringr) # 定义分组和需要交互的变量 groups <- c("Group 1", "Group 2") interact_vars <- c("var2", "var3") # 生成目标公式列表 formulas_list <- map(groups, function(group) { # 对每个分组,生成对应两个回归公式 map(interact_vars, function(var) { # 先拼接完整的公式字符串(处理分组名里的空格,用反引号包裹) formula_text <- str_c("log(price) ~ year + `var1_", str_replace_all(group, " ", "_"), "`:", var) # 将字符串转为公式 as.formula(formula_text) }) %>% # 给公式命名为reg1、reg2 set_names(paste0("reg", seq_along(interact_vars))) })
方法二:结合modelr::formulas与交叉组合
如果想更贴合modelr的工作流,可以用tidyr::crossing生成所有分组-交互变量的组合,再批量转公式:
library(modelr) library(tidyr) library(dplyr) library(stringr) groups <- c("Group 1", "Group 2") interact_vars <- c("var2", "var3") # 生成所有组合并转换为公式 formula_result <- crossing(group = groups, interact_var = interact_vars) %>% mutate( # 拼接公式字符串 formula_str = str_c("log(price) ~ year + `var1_", str_replace_all(group, " ", "_"), "`:", interact_var), # 转为公式对象 formula = map(formula_str, as.formula), # 生成公式名称 reg_name = paste0("reg", row_number()) ) %>% # 调整格式为分组嵌套的列表 select(group, reg_name, formula) %>% pivot_wider(names_from = reg_name, values_from = formula) %>% split(.$group) %>% map(~select(., -group))
运行后得到的结果会是你需要的解析完成的公式,不会再保留str_c()的原表达式。
内容的提问来源于stack exchange,提问作者user123456
相关产品推荐
相关产品推荐

