2016-12-20 11 views
2

私は、3列(月、年、値)のデータフレームdfを持っています。季節平均を月データでn年の時系列で計算します

>head(df) 
     months year value 
     January 01 23875.00 
    February 01 15343.25 
     March 01 9584.25 
     April 01 19026.33 
      May 01 26324.00 
     June 01 31228.00 

ごとに12行(1月から開始)、今年は02、03、04、などを行く... 16. まで、私は夏のために 、すなわち季節の手段を計算する必要がある、(12月の月平均値、2月);秋平均(3月、4月、5月)、冬平均(6月、7月、8月)および春平均(9月、10月、11月)

次に、季節、年、平均値で新しいデータフレームを作成し、このようなデータを取得します。すべての年で

>head(seasdf) 
season year value 
DJF 01  
MAM 01  
JJA 01  
SON 01  
DJF 02  
MAM 02  

16までの私は、データフレームのこの種で同様の質問を探し、しかし、私はそれを行うための方法を見つけることができませんでした。

このnoobの質問に申し訳ありません。

答えて

2

同じ四半期の隣の月はすべて同じ四半期の名前と年を持ち、その四半期は四半期が終了する年の後に名前が付けられます。たとえば、2001年12月、2002年1月、2002年2月は、すべてDJF 2002の四半期の一部となります。

最初に年と月を"yearmon"クラス変数、ymに変換してから、1/12を加算して月を前進させます。これは、yearmon変数がJanの場合は+ 0、Febの場合は1/12、Marの場合は2/12などとして格納されるという事実に基づいています。次に、クラス変数yqに変換します。ここでvalueyqで集計すると、yearqtr変数が正しくソートされ、2001 Q1が2001 Q2などの前に来ることに注意してください。最後に、質問に表示されている列を集約したデータフレームを再構成します。

library(zoo) # yearmon and yearqtr classes 

ym <- as.yearmon(paste(DF$months, DF$year), "%B %y") 
yq <- as.yearqtr(ym + 1/12) 

Ag <- aggregate(value ~ yq, DF, mean) 

season.name <- c("DJF", "MAM", "JJA", "SON") 
with(Ag, data.frame(year = as.integer(yq), season = season.name[cycle(yq)], value)) 

与える:

year season value 
1 2001 DJF 19609.12 
2 2001 MAM 18311.53 
3 2001 JJA 31228.00 

質問に示す正確なレイアウトは、その後、我々は上記のコードの最後の2行を省略することができ、ちょうど使用は重要ではない場合Ag

> Ag 
     yq value 
1 2001 Q1 19609.12 
2 2001 Q2 18311.53 
3 2001 Q3 31228.00 

注:再現可能な形式の入力DFは、

DF <- structure(list(months = c("January", "February", "March", "April", 
"May", "June"), year = c("01", "01", "01", "01", "01", "01"), 
    value = c(23875, 15343.25, 9584.25, 19026.33, 26324, 31228 
    )), .Names = c("months", "year", "value"), class = "data.frame", row.names = c(NA, -6L)) 
2

あなたのmonthsのような変数が標準的な月の名前であるとすれば、Rの変数month.nameと一致させることができます。つまり、(1月は1、2月は2などになります) 12月は、次まで圧延する必要がある場合

library(dplyr) 
df %>% group_by(season = match(months, month.name) %% 12 %/% 3, year) %>% 
     summarise(value = mean(value)) %>% ungroup() %>% 

     # optional: convert the season from number to meaningful labels which could also be 
     # summer, autumn, winter and spring 
     mutate(season = factor(season, levels = c(0,1,2,3), 
             labels = c("DJF", "MAM", "JJA", "SON"))) 

# A tibble: 3 × 3 
# season year value 
# <fctr> <int> <dbl> 
#1 DJF  1 19609.12 
#2 MAM  1 18311.53 
#3 JJA  1 31228.00 

yearは別に、別のグループ変数としてシーズンを取得する、そしてそれは、年によってグループに些細なことシーズン、平均を取るべき3のmonths == "December"の場合、year変数に1を加算できます:

関連する問題