【问题标题】:Standardize data using monthly mean and sd使用月均值和标准差标准化数据
【发布时间】:2017-10-09 05:53:54
【问题描述】:

我有一个 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”,但我仍然无法得到我想要的结果。

【问题讨论】:

    标签: r standardized


    【解决方案1】:

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

    【讨论】:

    • 谢谢。这有帮助!同时我也尝试使用聚合函数,它也给出了每个月的平均值和标准差。 m
    • 但是,我必须为 mean 和 sd 创建单独的数据框。这个更好..谢谢!!
    • @Pulsar_534511 如果对您有帮助,请将问题标记为已回答