R语言中排除分类列对数据框进行归一化的方法求助
解决R语言矩阵归一化时保留分类列的问题
没问题,我来帮你搞定这个事儿!你遇到的问题其实很常见——要归一化大部分变量,但保留最后一列的分类因子,核心思路就是先分离需要处理的列和分类列,完成归一化后再把它们重新合并就行。我给你两种实用的方法,你可以按需选择:
方法一:基础R分步操作(适合不想额外加载包的情况)
你的代码已经走对了第一步,只是在合并的时候可能因为数据类型的问题卡壳了,调整一下就行:
- 先把分类列单独提取出来保存:
# 提取最后一列的分类变量,假设它是第12列 category_col <- mywines[, 12]
- 继续完成你的归一化操作,记得把结果转成数据框(避免矩阵和因子列合并时出问题):
minimum <- apply(mywines[, -12], 2, min) maximum <- apply(mywines[, -12], 2, max) # 执行归一化,转成数据框 normalized_df <- as.data.frame(scale(mywines[, -12], center = minimum, scale = (maximum - minimum)))
- 把分类列重新合并回去,还可以恢复原来的列名:
mywinesNorm <- cbind(normalized_df, category_col) # 把最后一列的名字改回原来的列名 colnames(mywinesNorm)[ncol(mywinesNorm)] <- colnames(mywines)[12]
方法二:用dplyr简化操作(更直观的tidy风格)
如果你愿意用dplyr包,一行代码就能搞定,不用手动分离合并:
- 先加载包(如果没安装的话先跑
install.packages("dplyr")):
library(dplyr)
- 直接对除最后一列外的所有列做归一化,分类列保持原样:
mywinesNorm <- mywines %>% mutate_at(vars(-last_col()), ~(. - min(.)) / (max(.) - min(.)))
这里last_col()会自动选中最后一列,mutate_at只对剩下的列执行归一化计算,完全不影响分类列。
小提醒
如果你的数据里有缺失值(NA),记得在求min和max的时候加上na.rm = TRUE,比如:
minimum <- apply(mywines[, -12], 2, min, na.rm = TRUE) maximum <- apply(mywines[, -12], 2, max, na.rm = TRUE)
不然归一化的时候会出错哦!
内容的提问来源于stack exchange,提问作者Doppler
相关产品推荐
相关产品推荐

