【问题标题】:Seasonal aggregate of monthly data每月数据的季节性汇总
【发布时间】:2014-03-02 05:39:55
【问题描述】:

我有数据框 df,每个 x,y 点的 x,y 和每月.年数据。
我正在尝试获取季节性汇总。 我需要计算季节性平均值,即
对于(12 月、1 月、2 月)的冬季平均值;用于(3 月、4 月、5 月)的春季平均值、(6 月、7 月、8 月)的夏季平均值和(9 月、10 月、11 月)的秋季平均值。

数据看起来类似于:

set.seed(1)
df <- data.frame(x=1:3,y=1:3, matrix(rnorm(72),nrow=3) )
names(df)[3:26] <- paste(month.abb,rep(2009:2010,each=12),sep=".")

  x y   Jan.2009   Feb.2009 ...   Dec.2010
1 1 1 -0.6264538  1.5952808 ...  2.1726117
2 2 2  0.1836433  0.3295078 ...  0.4755095
3 3 3 -0.8356286 -0.8204684 ... -0.7099464

除了熔化数据并制作新的数据框之外,我想不出任何进一步的方法

ddt.m<-melt(df,id=c("x","y"))

我想要像每年季节的 x,y,mean 这样的结果。 请建议我如何才能做到这一点。

【问题讨论】:

    标签: r aggregate plyr zoo reshape2


    【解决方案1】:

    这是一种可能的方法:

    melt 数据,正如你所建议的......

    ...并且,使用colsplit 将“变量”拆分为“Mon”和“Year”列。

    library(reshape2)
    ddt.m <- melt(df, id = c("x", "y"))
    ddt.m <- cbind(ddt.m, colsplit(ddt.m$variable, "\\.", c("Mon", "Year")))
    

    使用 factorlevels 获取您的季节

    (我已将其留在“星期一”列中。哎呀。)

    ddt.m$Mon <- factor(ddt.m$Mon)
    levels(ddt.m$Mon) <- list(Winter = month.abb[c(12, 1, 2)],
                              Spring = month.abb[c(3:5)],
                              Summer = month.abb[c(6:8)],
                              Autumn = month.abb[c(9:11)])
    head(ddt.m)
    #         x        y variable     value    Mon Year
    # 1 1214842 991964.4 Jan.2009 -1.332933 Winter 2009
    # 2 1220442 991964.4 Jan.2009 -1.345808 Winter 2009
    # 3 1226042 991964.4 Jan.2009 -1.314435 Winter 2009
    # 4 1231642 991964.4 Jan.2009 -1.236600 Winter 2009
    # 5 1237242 991964.4 Jan.2009 -1.261989 Winter 2009
    # 6 1242842 991964.4 Jan.2009 -1.306614 Winter 2009
    

    使用dcast聚合数据

    dfSeasonMean <- dcast(ddt.m, x + y ~ Mon + Year, 
                          value.var="value", fun.aggregate=mean)
    head(dfSeasonMean)
    #         x        y Winter_2009 Winter_2010 Spring_2009 Spring_2010 Summer_2009
    # 1 1214842 991964.4   -1.439480   -1.006512 -0.02509008   0.2823048    1.392440
    # 2 1220442 964154.4   -1.457407   -1.039266 -0.04337596   0.2315217    1.422541
    # 3 1220442 973424.4   -1.456991   -1.035115 -0.04117584   0.2423561    1.414473
    # 4 1220442 982694.4   -1.456479   -1.029627 -0.03799926   0.2544062    1.405813
    # 5 1220442 991964.4   -1.456234   -1.027081 -0.03815661   0.2610397    1.400743
    # 6 1226042 945614.4   -1.463465   -1.031665 -0.04288670   0.2236609    1.434002
    #   Summer_2010 Autumn_2009 Autumn_2010
    # 1    1.256840  0.06469363 -0.03823892
    # 2    1.263593  0.04521096 -0.04485553
    # 3    1.258328  0.04860321 -0.04477636
    # 4    1.252779  0.05337575 -0.04729598
    # 5    1.247251  0.05742809 -0.05152524
    # 6    1.272742  0.04692731 -0.04915314
    

    【讨论】:

    • 感谢您的回复。谢谢大家。
    【解决方案2】:

    将每个年/月名称转换为 zoo yearmon 对象并添加 1/12 以将其推送到下个月。添加一个月后,4 个季节对应于日历季度,因此转换为动物园 yearqtr 对象。然后将数据与没有截距的年份季度进行回归,系数将是所需的方法:

    library(zoo)
    
    df0 <- df[-(1:2)]
    Y <- format(as.yearqtr(as.yearmon(names(df0), "%b.%Y") + 1/12)) # "2009 Q1" "2009 Q1" ...
    cbind(df[1:2], t(coef(lm(t(df0) ~ Y + 0))))
    

    给出以下内容。请注意,季节是按季节结束的日历季度标记的:

      x y   Y2009 Q1   Y2009 Q2    Y2009 Q3   Y2009 Q4   Y2010 Q1    Y2010 Q2    Y2010 Q3  Y2010 Q4   Y2011 Q1
    1 1 1  0.4844135 -0.1464000  0.51947463  0.1692510  0.1050269 -0.04095933 -0.07437911 0.2082204  2.1726117
    2 2 2  0.2565755  0.0118020  0.21742535 -0.2123555 -0.5336322  0.60078430  0.96374641 0.2276805  0.4755095
    3 3 3 -0.8280485  0.6968518 -0.04217937  0.2166059  0.1438897  0.15929437 -0.54387973 0.3439283 -0.7099464
    

    【讨论】:

      【解决方案3】:

      对于每个感兴趣的时期,您可以采用如下方法:

      spring_months <- paste0(c("Mar","Apr","May"),".2009"
      spring_mean <- rowMeans(df[,spring_months], na.rm=T)
      
      winter_months <- c("Dec.2009","Jan.2010","Feb.2010")
      winter_mean <- rowMeans(df[,winter_months], na.rm=T)
      

      然后您可以只取这些变量并使用df$xdf$y 创建一个数据框:

      data.frame(x=df$x, y=df$y, spring_mean = spring_mean, winter_mean = winter_mean)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多