如何用z-score及dplyr的mutate函数标准化股票收盘价数据
用dplyr实现z-score标准化
需求说明
需要对数据框中A、B、C三列的收盘价进行z-score标准化(公式:z = (x – μ) / σ),可以通过dplyr的mutate()结合across()函数批量处理多列,以下是具体实现方式:
代码实现
首先加载dplyr包,然后对目标列进行标准化:
library(dplyr) # 原始数据框 df1 <- data.frame(date = c("01.01.", "02.01.", "03.01.", "04.01.", "05.01."), A = c(102, 103, 107, 120, 134), B = c(94, 95, 100, 93, 90), C = c(55, 53, 50, 51, 48)) # 方式1:生成带_z后缀的新标准化列,保留原数据 df_zscore_new <- df1 %>% mutate(across(c(A, B, C), ~(.x - mean(.x)) / sd(.x), .names = "{col}_z")) # 方式2:直接覆盖原列,替换为标准化后的值 df_zscore_overwrite <- df1 %>% mutate(across(c(A, B, C), ~(.x - mean(.x)) / sd(.x)))
关键说明
across(c(A, B, C)):指定需要处理的列,也可以用across(-date)排除日期列,自动处理所有数值列~(.x - mean(.x)) / sd(.x):这是z-score的匿名函数实现,.x代表当前处理的列.names = "{col}_z":设置新列的命名规则,{col}会自动替换为原列名,生成如A_z、B_z的新列
关于标准差的补充
如果需要使用总体标准差(除以n,而非样本标准差的n-1),可以将公式改为:
~(.x - mean(.x)) / sqrt(mean((.x - mean(.x))^2))
内容的提问来源于stack exchange,提问作者DunkinDont
相关产品推荐
相关产品推荐

