0

我有一个 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")

但是,据我了解,上述方式使用整列的平均值和标准差给出了标准化值。我尝试使用函数“group_by”将数据逐月分开,还尝试了函数“subset”,但我仍然无法得到我想要的结果。

4

1 回答 1

1

您可以使用 package 执行此任务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
        )
于 2017-05-10T15:03:07.267 回答