2016-04-07 8 views
3

5年間のステップに基づいてデータの新しいグループ化変数を作成するにはどうすればよいですか?期間に基づいてグループを作成する

だからこれから:これに

group <- c(rep("A", 7), rep("B", 10)) 
year <- c(2008:2014, 2005:2014) 
dat <- data.frame(group, year) 

    group year 
1  A 2008 
2  A 2009 
3  A 2010 
4  A 2011 
5  A 2012 
6  A 2013 
7  A 2014 
8  B 2005 
9  B 2006 
10  B 2007 
11  B 2008 
12  B 2009 
13  B 2010 
14  B 2011 
15  B 2012 
16  B 2013 
17  B 2014 

> dat 
    group year period 
1  A 2008 2005_2009 
2  A 2009 2005_2009 
3  A 2010 2010_2014 
4  A 2011 2010_2014 
5  A 2012 2010_2014 
6  A 2013 2010_2014 
7  A 2014 2010_2014 
8  B 2005 2005_2009 
9  B 2006 2005_2009 
10  B 2007 2005_2009 
11  B 2008 2005_2009 
12  B 2009 2005_2009 
13  B 2010 2010_2014 
14  B 2011 2010_2014 
15  B 2012 2010_2014 
16  B 2013 2010_2014 
17  B 2014 2010_2014 

私はcut(dat$year, breaks = ??)を使用することができると思いますが、私は休憩を設定する方法がわかりません。

答えて

4

は、ここでそれを行うための一つの方法です。ここで


一般的に動作するはずバージョンです:

x <- 5 
yearstart <- 2000 
dat$period <- paste(min <- floor((dat$year-yearstart)/x)*x+yearstart, 
        min+x-1,sep = "_") 

あなたは、例えば確保するためyearstartを使用することができますxがそれの倍数でない場合、2000年がグループの最初のものです。

+0

非常にうまくいった。その1つの効率を賢明にするのは難しいと思う。 –

+0

ありがとうございます、私の例のためにうまくいきます。しかし、例えば1秒の間隔に調整することは可能である。 10年(私は試してみると間隔2010_1019を作ります)? – beetroot

+0

10年も私のために働く: 'ペースト(分$ 10/10)* 10、分+9、セップ=" _ ")'。ニースの解決策! – fdetsch

1

cutは、実際のDate個のオブジェクトを 'year'列から作成した場合、その作業を行う必要があります。私はここでのトリックはfloor(year/x)*x機能であなたの年よりも最大の整数少ない得ることであると思い

dat$period <- paste(min <- floor(dat$year/5)*5, min+4,sep = "_") 

## convert 'year' column to dates 
yrs <- paste0(dat$year, "-01-01") 
yrs <- as.Date(yrs) 

## create cuts of 5 years and add them to data.frame 
dat$period <- cut(yrs, "5 years") 

## create desired factor levels 
library(lubridate) 

lvl <- as.Date(levels(dat$period)) 
lvl <- paste(year(lvl), year(lvl) + 4, sep = "_") 
levels(dat$period) <- lvl 

head(dat) 
    group year period 
1  A 2008 2005_2009 
2  A 2009 2005_2009 
3  A 2010 2010_2014 
4  A 2011 2010_2014 
5  A 2012 2010_2014 
6  A 2013 2010_2014 
+0

ありがとうございます、非手動で期間のレベルを作成する方法はありますか?私の実際のデータセットは200年以上にわたり、退屈なものになるでしょう。 – beetroot

+1

確かな@beetroot。上記のアップデートを見てください。 ** lubridate **から 'year'を使って各期間の開始点と終了点を作成してください。 – fdetsch

関連する問題