如何在data.frame中按行用变量名筛选MuMIn的dredge对象?
解决dredge对象按行动态筛选的问题
问题重现
先模拟你的场景,生成测试数据、模型和目标数据框:
library(MuMIn) library(dplyr) library(purrr) library(rlang) # 模拟数据集 set.seed(123) dat <- data.frame( y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = rnorm(100) ) # 拟合全模型并运行dredge full_mod <- lm(y ~ x1 + x2 + x3, data = dat, na.action = na.fail) dredge_obj <- dredge(full_mod) # 创建存储变量名和dredge对象的data.frame df <- tibble( var_name = c("x1", "x2", "x3"), dredge_list = list(dredge_obj, dredge_obj, dredge_obj) )
直接用固定列名筛选dredge对象正常:
# 固定列名筛选有效 filter(dredge_obj, x1 == TRUE)
但调用var_name列的字符串筛选时失败,这是因为dplyr的非标准求值不会自动将字符串转换为列名引用。
解决方案
推荐用purrr::map2结合rlang::sym实现动态列名筛选,比rowwise更稳定:
df <- df %>% mutate(selected = map2(dredge_list, var_name, ~ filter(.x, !!sym(.y) == TRUE)))
如果坚持用rowwise,可以用eval(parse())解析字符串为表达式:
df <- df %>% rowwise() %>% mutate(selected = filter(dredge_list, eval(parse(text = var_name)) == TRUE)) %>% ungroup()
原理说明
sym(.y)将字符串格式的列名转换为dplyr可识别的符号对象!!强制求值该符号,让filter函数识别为dredge对象的列名map2逐行匹配dredge_list和var_name,避免rowwise的非标准求值冲突
内容的提问来源于stack exchange,提问作者M. Riera
相关产品推荐
相关产品推荐

