2016-04-07 19 views
3

Wie kann ich eine neue Gruppierungsvariable für meine Daten basierend auf 5-Jahres-Schritten erstellen?Erstellen von Gruppen basierend auf dem Zeitraum

So hieraus:

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 

Um dies:

> 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 

Ich glaube, ich cut(dat$year, breaks = ??) verwenden könnte, aber ich weiß nicht, wie die Pausen zu setzen.

Antwort

4

Hier ist eine Möglichkeit, es zu tun:

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

Ich denke, der Trick hier ist die größte ganze Zahl kleiner als Ihr Jahr mit der floor(year/x)*x Funktion zu erhalten.


Hier ist eine Version, die im Allgemeinen funktionieren sollte: kann

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

Sie yearstart verwenden zum Beispiel, um sicherzustellen, Jahr 2000 ist das erste in einer Gruppe für, wenn x kein Vielfaches davon ist.

+0

Sehr schön gemacht. Ich denke, es wird schwer sein, diese eine Effizienz weise zu schlagen. –

+0

Danke, funktioniert gut für mein Beispiel. Aber ist es möglich, sich auf Intervalle von z.B. 10 Jahre (erstellt ein Intervall 2010_1019 wenn ich es versuche)? – beetroot

+0

10 Jahre arbeiten auch für mich: 'paste (min <- floor (dat $ Jahr/10) * 10, min + 9, sep =" _ ")'. Schöne Lösung! – fdetsch

1

sollten Sie den Job ausführen, wenn Sie tatsächliche Date Objekte aus Ihrer Spalte "Jahr" erstellen.

## 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

Danke, gibt es eine Möglichkeit, die Ebenen der Periode nicht manuell zu erstellen? Mein tatsächlicher Datensatz erstreckt sich über mehr als 200 Jahre, also wäre das mühsam ... – beetroot

+1

Sure @beetroot. Sehen Sie sich das obige Update an. Verwenden Sie einfach 'year' von ** lubridate **, um den Start- und Endpunkt jeder Periode zu erstellen. – fdetsch

Verwandte Themen