2017-05-05 3 views
1

Ich habe einen Datenrahmen, wo eine der Spalten Daten enthält (einige Daten erscheinen mehrmals). Ich möchte die Daten nach Wochen aggregieren. Der beste Weg, um darüber nachzudenken, ist, die Daten auf den nächsten Montag zu runden. Wie kann ich Termine abrunden? Wie kann ich diese Liste von Daten in Wochen umwandeln?R: Abgerundete Daten zum ersten Tag der Woche

2016-04-04 
2016-04-05 
2016-04-06 
2016-04-07 
2016-04-08 
2016-04-09 
2016-04-10 
2016-04-11 
2016-04-12 
2016-04-13 
2016-04-14 

Erwartete Ausgabe sollte sein:

2016-04-04 
2016-04-04 
2016-04-04 
2016-04-04 
2016-04-04 
2016-04-04 
2016-04-04 
2016-04-11 
2016-04-11 
2016-04-11 
2016-04-11 
+1

Mögliches Duplikat [R: Wie Datum in der gleichen Woche beurteilen] (http://stackoverflow.com/questions/43775261/r- How-to-Judgement-Datum-in-der-gleichen-Woche) – Uwe

+1

Scheint wie [dies] (http://stackoverflow.com/questions/26160117/changing-lubridate-function-to-start-on-monday-rather -than-sunday) könnte helfen. –

+1

können Sie einfach den 'wday' von Ihrem Datum subtrahieren. 'lubridate' und' data.table' haben Implementierungen dieser Funktion. – MichaelChirico

Antwort

0

cut() von der Basis R hat zwei Methoden für Objekte der Klasse Date und POSIXt, die davon ausgehen, dass Wochen am Montag standardmäßig starten (können aber auch bis Sonntag mit start.on.monday = FALSE geändert werden).

dates <- c("2016-04-04", "2016-04-05", "2016-04-06", "2016-04-07", "2016-04-08", 
      "2016-04-09", "2016-04-10", "2016-04-11", "2016-04-12", "2016-04-13", 
      "2016-04-14") 
result <- data.frame(
    dates, 
    cut_Date = cut(as.Date(dates), "week"), 
    cut_POSIXt = cut(as.POSIXct(dates), "week"), 
    stringsAsFactors = FALSE) 

result 
#  dates cut_Date cut_POSIXt 
#1 2016-04-04 2016-04-04 2016-04-04 
#2 2016-04-05 2016-04-04 2016-04-04 
#3 2016-04-06 2016-04-04 2016-04-04 
#4 2016-04-07 2016-04-04 2016-04-04 
#5 2016-04-08 2016-04-04 2016-04-04 
#6 2016-04-09 2016-04-04 2016-04-04 
#7 2016-04-10 2016-04-04 2016-04-04 
#8 2016-04-11 2016-04-11 2016-04-11 
#9 2016-04-12 2016-04-11 2016-04-11 
#10 2016-04-13 2016-04-11 2016-04-11 
#11 2016-04-14 2016-04-11 2016-04-11 

Beachten Sie, dass cut() kehrt Faktoren, die für die Aggregation perfekt ist, wie durch die OP angefordert:

str(result) 
#'data.frame': 11 obs. of 3 variables: 
# $ dates  : chr "2016-04-04" "2016-04-05" "2016-04-06" "2016-04-07" ... 
# $ cut_Date : Factor w/ 2 levels "2016-04-04","2016-04-11": 1 1 1 1 1 1 1 2 2 2 ... 
# $ cut_POSIXt: Factor w/ 2 levels "2016-04-04","2016-04-11": 1 1 1 1 1 1 1 2 2 2 ... 

jedoch mit ggplot2 aggregierten Werte für das Plotten (und wenn es eine große Anzahl von Wochen ist, die vielleicht Unordnung der Achse) Es könnte besser sein, von einer diskreten Zeitskala zu einer kontinuierlichen Zeitskala zu wechseln. Dann ist es notwendig, Faktoren zurück zu Date oder POSIXct zu zwingen:

as.Date(as.character(result$cut_Date)) 
as.POSIXct(as.character(result$cut_Date)) 
2

Mit lubridate Sie dies versuchen könnte:

library(lubridate) 
dates <- seq.Date(as.Date("2016-04-04"), as.Date("2016-04-14"), by = 1) 
floor_date(dates - 1, "weeks") + 1 

floor_date Wochen beginnt am Sonntag, so zu vermeiden, die in der nächsten Woche enthalten sind Sie müssen einen vor dem Runden abziehen und dann den Wert um einen Tag erhöhen.

Verwandte Themen