使用月平均值和标准差来标准化数据

时间:2017-05-10 14:07:49

标签: r standardized

我有一个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年数据计算的每个月的均值和sd,并使用计算的均值和sd标准化每个变量。为此,首先我应该得到50年来每个月的平均值和sd(即总共12个平均值和12个sd值)。 我是R的新手,我不知道如何计算data.frame中每个月50年的平均值。我使用以下函数来获得标准化值:

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

然而,据我所知,上述方法使用整列的均值和sd给出标准化值。我尝试使用函数“group_by”逐月分离数据,并尝试使用“子集”功能,但我仍然无法得到我想要的结果。

1 个答案:

答案 0 :(得分:0)

您可以使用包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
        )