我有一个50年的数据集(每日价值),格式如下:
Date 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
我想标准化数据月份wise,即使用根据50年数据计算的每个月的平均值和sd,并使用计算的平均值和sd对每个变量进行标准化。因此,首先,我应该从50年中得到每个月的平均值和sd值(即总计12个平均值和12个sd值)。我对R并不熟悉,我不知道如何计算data.frame中每个月的平均50年。我使用以下函数来获得标准化的值:
Std_data←data.Normalization (data,type="n1",normalization="column")
但是,根据我的理解,上面的方法使用整个列的平均值和sd给出了标准化的值。我尝试使用函数"group_by“来分隔数据月份,也尝试了函数”子集“,但仍然无法得到我想要的结果。
发布于 2017-05-10 15:03:07
可以使用包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
)https://stackoverflow.com/questions/43894907
复制相似问题