R语言批量将数据框正负值分别缩放到[0,1]和[-1,0]区间的实现方法
实现方案
核心缩放规则对每一列数值统一生效:
- 列内所有正数除以该列的最大值,映射到[0,1]区间
- 列内所有负数除以该列最小值的绝对值,映射到[-1,0]区间
- 0值保持不变
两种实现方案都支持自动批量处理所有数值列,无需手动指定2000个列名:
方案1:tidyverse(dplyr)实现
适合习惯tidyverse语法的用户,非数值列会自动保留不处理:
library(dplyr) # 自定义列缩放函数 custom_scale <- function(x) { if(!is.numeric(x)) return(x) max_val <- max(x, na.rm = TRUE) min_val <- min(x, na.rm = TRUE) res <- case_when( x > 0 ~ x / max_val, x < 0 ~ x / abs(min_val), TRUE ~ 0 ) # 如需和示例一致保留2位小数,可取消注释下行 # res <- round(res, 2) return(res) } # 批量处理所有数值列 Output_df <- Input_df %>% mutate(across(where(is.numeric), custom_scale))
方案2:base R实现
无需安装任何第三方包,执行效率更高,适合大体积数据框处理:
# 自定义列缩放函数 custom_scale <- function(x) { if(!is.numeric(x)) return(x) max_val <- max(x, na.rm = TRUE) min_val <- min(x, na.rm = TRUE) res <- ifelse(x > 0, x/max_val, ifelse(x < 0, x/abs(min_val), 0)) # 如需保留2位小数,可取消注释下行 # res <- round(res, 2) return(res) } # 批量应用到所有列 Output_df <- as.data.frame(lapply(Input_df, custom_scale))
内容的提问来源于stack exchange,提问作者SUMIT
相关产品推荐
相关产品推荐

