You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:23:11