You need to enable JavaScript to run this app. R语言混合数据框训练测试集指定数值列不执行标准化的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

R语言混合数据框训练测试集指定数值列不执行标准化的实现方法

解决方案

你可以用dplyr的across()语法实现需求,无需拆分合并列,直接指定排除Col6、Col7的数值列做标准化即可。

步骤1:定义不需要标准化的列

no_scale_cols <- c("Col6", "Col7")

步骤2:处理训练集,保留无需缩放的列同时完成标准化

# 训练集标准化
Train_Scale <- Train_Set %>%
  dplyr::mutate(
    # 筛选:数值型 且 不在无需缩放列表中的列执行标准化
    dplyr::across(
      .cols = where(is.numeric) & !dplyr::all_of(no_scale_cols),
      .fns = ~scale(.) %>% as.vector
    )
  )

# 提取训练集的标准化参数(均值、标准差),用于测试集的标准化
num_scale_cols <- names(which(sapply(Train_Set, \(x) is.numeric(x) && !names(x) %in% no_scale_cols)))
scale_params <- attributes(scale(Train_Set[, num_scale_cols]))[c("scaled:center", "scaled:scale")]

步骤3:用训练集的参数处理测试集,保留无需缩放的列

Test_Scale <- Test_Set %>%
  dplyr::mutate(
    dplyr::across(
      .cols = dplyr::all_of(num_scale_cols),
      .fns = ~scale(., 
                    center = scale_params[["scaled:center"]][dplyr::cur_column()], 
                    scale = scale_params[["scaled:scale"]][dplyr::cur_column()]) %>% as.vector
    )
  )

报错原因说明

你之前的写法报错是因为mutate_if的参数规则为:第一个参数是列的筛选条件,第二个参数是要应用的函数,你额外传入了!index属于参数传入错误,不符合函数定义规则。

如果使用旧版dplyr的scoped动词,也可以用mutate_at实现相同效果:

varnames <- c('Col6', 'Col7')
num_cols <- names(which(sapply(Train_Set, is.numeric)))
scale_cols <- setdiff(num_cols, varnames)

Train_Scale_Check <- Train_Set %>% 
  dplyr::mutate_at(.vars = scale_cols, .funs = ~scale(.) %>% as.vector)

内容的提问来源于stack exchange,提问作者Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 19:45:03