使用recipes包时,如何高效引入Ames住房数据中所有后缀为SF的变量?
解决Ames数据集recipes变量引入与PCA问题
核心问题修正
你之前的尝试失败主要有三个原因:
- 公式拼接错误:不能将完整公式(如
SF)与其他变量用+直接拼接 - 字符串无法直接作为变量:
paste(grep(...))生成的字符串无法被R识别为变量名 - 正则表达式不完整:
step_pca中的匹配规则未闭合,导致无法正确识别目标变量
正确实现方法
方法一:先构建完整公式
先精准筛选后缀为SF的变量,再合并其他预测变量生成完整公式:
# 精准获取所有后缀为SF的变量($表示匹配字符串结尾) sf_vars <- grep("SF$", names(ames_train), value = TRUE) # 合并所有需要的预测变量 all_predictors <- c(sf_vars, "Neighborhood", "Gr_Liv_Area", "Year_Built", "Bldg_Type", "Latitude") # 生成响应变量为Sale_Price的完整公式 full_formula <- reformulate(all_predictors, response = "Sale_Price") # 构建配方 simple_ames <- recipe(full_formula, data = ames_train) %>% step_log(Gr_Liv_Area, base = 10) %>% step_other(Neighborhood, threshold = 0.01) %>% step_dummy(all_nominal_predictors()) %>% step_interact(~ Gr_Liv_Area:starts_with('Bldg_Type_')) %>% step_ns(Latitude, deg_free = 20) %>% step_pca(matches("(SF$)|(Gr_Liv_Area)")) # 修正正则,匹配SF后缀和Gr_Liv_Area
方法二:用all_of()直接在公式中引入变量列表
借助tidyselect的all_of()函数,直接在配方公式中引入筛选出的变量,更简洁:
sf_vars <- grep("SF$", names(ames_train), value = TRUE) simple_ames <- recipe(Sale_Price ~ all_of(sf_vars) + Neighborhood + Gr_Liv_Area + Year_Built + Bldg_Type + Latitude, data = ames_train) %>% step_log(Gr_Liv_Area, base = 10) %>% step_other(Neighborhood, threshold = 0.01) %>% step_dummy(all_nominal_predictors()) %>% step_interact(~ Gr_Liv_Area:starts_with('Bldg_Type_')) %>% step_ns(Latitude, deg_free = 20) %>% step_pca(matches("(SF$)|(Gr_Liv_Area)"))
额外说明
- 正则表达式
(SF$)|(Gr_Liv_Area)确保只匹配后缀为SF的变量和Gr_Liv_Area,避免误匹配其他含SF的变量 - 如果需要匹配所有以
Gr_Liv开头的变量,可将正则改为(SF$)|(^Gr_Liv)
内容的提问来源于stack exchange,提问作者toku_mo
相关产品推荐
相关产品推荐

