2017-01-24 5 views
1

Ich habe Daten, die Daten enthält (TT/MM/JJJJ) und bin bestrebt, die Daten nach Jahr zusammenzufassen. Ich bin mir sicher, dass es einen einfacheren Weg dafür gibt, aber der Weg, den ich eingeschlagen habe, besteht darin, eine neue kategoriale Variable mit der Funktion "Ausschneiden" zu erstellen.Erstellen Sie eine kategoriale Variable von Datum Daten in R

Zum Beispiel:

# create sample dataframe 
dates<-c("01/01/2013", "01/02/2013", "01/01/2014", "01/02/2014", "01/01/2015", "01/02/2015") 
cases<-c(3,5,2,6,8,4) 
df<-as.data.frame(cbind(dates, cases)) 
df$dates <- as.Date(df$dates,"%d/%m/%Y") 

# categorise by year 
df$year <- cut(df$dates, c(2013-01-01, 2013-12-31, 2014-12-31, 2015-12-31)) 

Dies gibt einen Fehler:

invalid specification of 'breaks' 

Wie kann ich feststellen R bei verschiedenen "date" Intervallen geschnitten? Ist meine Herangehensweise falsch? Noch neu bei R (tut mir leid wegen der Grundfrage).

Greg

+0

Ihr 'Breaks'-Argument ist falsch. Die Eingabe sollte entweder Strings sein (was funktionieren könnte) oder Datumsobjekte, die leicht mit Strings erzeugt werden können (siehe Antwort von Leo P.). –

+0

Beachten Sie, dass das cbind dafür sorgt, dass "Fälle" zu einem Zeichen und nicht zu einem numerischen Zeichen werden. –

Antwort

0

Wie sollte Ihre Ausgabe aussehen?

Ihr Code funktioniert, wenn Sie Ihre Pausen mit as.Date definieren: obwohl

breaks <- as.Date(c("2013-01-01", "2013-12-31", "2014-12-31", "2015-12-31")) 

# categorise by year 
df$year <- cut(df$dates, breaks) 

     dates cases  year 
1 2013-01-01  3 2013-01-01 
2 2013-02-01  5 2013-01-01 
3 2014-01-01  2 2013-12-31 
4 2014-02-01  6 2013-12-31 
5 2015-01-01  8 2014-12-31 
6 2015-02-01  4 2014-12-31 

Ich vermute, Sie möchten, dass Ihre Variable year anders aussehen,? Sie können labels definieren, wenn cut mit:

# categorise by year 
df$year <- cut(df$dates, breaks, labels = c(2013, 2014, 2015)) 

     dates cases year 
1 2013-01-01  3 2013 
2 2013-02-01  5 2013 
3 2014-01-01  2 2014 
4 2014-02-01  6 2014 
5 2015-01-01  8 2015 
6 2015-02-01  4 2015 
1

, wenn Sie nur für das Jahr suchen, vielleicht hilft:

df$year <- format(df$dates, format="%Y")

 dates cases year 
1 2013-01-01  3 2013 
2 2013-02-01  5 2013 
3 2014-01-01  2 2014 
4 2014-02-01  6 2014 
5 2015-01-01  8 2015 
6 2015-02-01  4 2015 
1

Eine einfache Lösung wäre, die dplyr Paket. Hier ist ein einfaches Beispiel:

library(dplyr) 

df_grouped <- df %>% 
    mutate(
    dates = as_date(dates), 
    cases = as.numeric(cases)) %>% 
    group_by(year = year(dates)) %>% 
    summarise(tot_cases = sum(cases)) 

In der mutate Anweisung konvertieren wir die Variablen in ein geeigneteres Format, in group_by wir wählen, welche Variable die Gruppierung tun wird und in summarise schaffen wir keine neuen Variablen, die wir wollen .

df_grouped sieht wie folgt aus:

# A tibble: 3 × 2 
    year tot_cases 
    <dbl>  <dbl> 
1 2013   6 
2 2014   6 
3 2015   9 
+0

Beachten Sie, dass das Ergebnis Ihrer Lösung nicht korrekt ist. Die Spalte 'cases' in' df' ist ein Faktor. Wenn Sie 'as.numeric' aufrufen, wird keine korrekte Nummer erzeugt, sondern die zugrunde liegende Kategorie-ID der Faktorstufe. Sie müssen 'as.numeric (as.character())' aufrufen, um das korrekte Ergebnis sicherzustellen. Siehe meine Antwort für die richtige Lösung. Außerdem fehlt 2015 in der von Ihnen geposteten Ausgabe. –

1

Ich denke, die auf cut basierte Lösungen ein bisschen übertrieben sind. Sie können die year Funktion aus dem lubridate Paket verwenden das Jahr ab dem Zeitpunkt zu extrahieren:

library(dplyr) 
library(lubridate) 
df %>% mutate(year = year(dates)) 
#  dates cases year 
# 1 2013-01-01  3 2013 
# 2 2013-02-01  5 2013 
# 3 2014-01-01  2 2014 
# 4 2014-02-01  6 2014 
# 5 2015-01-01  8 2015 
# 6 2015-02-01  4 2015 

lubridate solch ein ehrfürchtiges Paket ist, wenn es um den Umgang mit Zeitdaten kommt.

Nachdem die Spalte year erstellt wurde, können Sie alle Arten von Zusammenfassungen anwenden. Ich benutze den dplyr Stil hier:

# Note that as.numeric(as.character()) is needed as `cbind` forces `cases` to be a factor 
df %>% mutate(year = year(dates), cases = as.numeric(as.character(cases))) %>% 
    group_by(year) %>% summarise(tot_cases = sum(cases)) 
# # A tibble: 3 × 2 
# year tot_cases 
# <dbl>  <dbl> 
# 1 2013   8 
# 2 2014   8 
# 3 2015  12 

Beachten Sie, dass group_by stellt sicher, dass alle Vorgänge nach, die pro einzigartige Kategorie gibt, pro Jahr in diesem Fall erwähnt fertig sind.

Verwandte Themen