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
相关产品推荐
相关产品推荐

