使用月均值和标准差对数据进行标准化

Standardize data using monthly mean and sd

我有一个 50 年的数据集(每日值),格式如下:

日期 Var1 Var2 Var3 Var4 Var5 Var6

1994-01-01 2.2 0.1 98 0 7.5 3.6

1994-01-02 4.1 3.2 70 0 2.6 5.2

1994-01-03 10.7 3.3 0 76 4.3 4.5

1994-01-04 8.5 2.3 2.6 90 0 .5 0.6

我想按月对数据进行标准化,即使用从 50 年的数据中计算出的每个月的均值和标准差,并使用计算出的均值和标准差对每个变量进行标准化。为此,首先我应该得到 50 年来每个月的平均值和标准差(即总共有 12 个平均值和 12 个标准差值)。 我是 R 的新手,我不知道如何计算 data.frame 中每个月的 50 年平均值。我使用以下函数来获取标准化值:

Std_data ← data.Normalization (data,type="n1",normalization="column")

但是,据我了解,上述方法使用整列的均值和标准差给出了标准化值。我尝试使用函数 "group_by" 来按月分隔数据,还尝试了函数 "subset" 但我仍然无法获得我想要的结果。

您可以使用程序包 plyr 执行此任务。

library(plyr)

#generate data
set.seed(1992)
n=99
Year <- sample(2013:2015, n, replace = TRUE, prob = NULL)
Month <- sample(1:12, n, replace = TRUE, prob = NULL)
V1 <- abs(rnorm(n))*100
V2 <- abs(rnorm(n))*100
V3 <- abs(rnorm(n))*100

df <- data.frame(Year, Month, V1, V2, V3)

#calculate mean and sd for each month
avg_sd <- ddply(df, .(Month), summarize,
  V1_m = mean(V1),
  V2_m = mean(V2),
  V3_m = mean(V3),
  V1_sd = sd(V1),
  V2_sd = sd(V2),
  V3_sd = sd(V3)
  )

#connect averages and sd's to data frame
df <- merge(df,avg_sd,by="Month")


#standatrise your variables. I used subtraction but you can use any formula you want
df <- ddply(df,.(Year, Month, V1, V2, V3, V1_m, V2_m, V3_m), summarize,
        s_m_V1 = V1-V1_m,
        s_m_V2 = V2-V2_m,
        s_m_V3 = V3-V3_m,
        s_sd_V1 = V1-V1_sd,
        s_sd_V2 = V2-V2_sd,
        s_sd_V3 = V3-V3_sd
        )