2016-11-14 6 views
3

Ich möchte meine Daten basierend auf ihrer Woche beschriften. Dies ist meine Daten:Gruppieren Sie Daten nach Woche in R

df2 <- structure(list(Order_Date = structure(c(16735, 16805, 16753, 
16830, 17075, 17009, 17085, 16740, 16891, 16750, 16820, 16849, 
16906, 16929, 16746, 16731, 16786, 16873, 16895, 16931), class = "Date")), .Names = "Order_Date", row.names = c(NA, 
-20L), class = "data.frame") 

und ich versuchte, sie auf die Woche zu beschriften basiert (0. Woche, 1. Woche und ....) und ich wünsche, dass meine Daten von der Woche zu einer Gruppe später

Und ich versuchte dies:

# order by data 
library (dplyr) 
df2<- arrange(df2, Order_Date) 


# label them by week 
$df2$week <- cumsum(weekdays(df2$Order_Date) == "Friday") 

Es gibt mir nicht das richtige Ergebnis, und ich habe die folgende Ausgabe, das ist seltsam

Order_Date week 
1 2015-10-27 0 
2 2016-01-05 0 
3 2015-11-14 0 
4 2016-01-30 0 
5 2016-10-01 0 
6 2016-07-27 0 
7 2016-10-11 0 
8 2015-11-01 0 
9 2016-03-31 0 
10 2015-11-11 0 
11 2016-01-20 0 
12 2016-02-18 0 
13 2016-04-15 1 
14 2016-05-08 1 
15 2015-11-07 1 
16 2015-10-23 2 
17 2015-12-17 2 
18 2016-03-13 2 
19 2016-04-04 2 
20 2016-05-10 2 

Idealerweise würde Ich mag diese Ausgabe haben:

Order_Date label 
1 2015-10-23 0 
2 2015-10-27 0 
3 2015-11-01 1 
4 2015-11-07 2 
5 2015-11-11 2 
6 2015-11-14 3 
7 2015-12-17 8 
8 2016-01-05 10 

seit Zeilennummer 8 10 Wochen nach der Zeilennummer 1 tritt auf, sondern auch eine Lösung, die die folgenden ist meine zweite Alternative erzeugt, die diese Daten zeigen, sind nicht in der gleiche Woche:

Order_Date label 
1 2015-10-23 0 
2 2015-10-27 0 
3 2015-11-01 1 
4 2015-11-07 2 
5 2015-11-11 2 
6 2015-11-14 3 
7 2015-12-17 4 
8 2016-01-05 5 
+0

Was ist Ihre erwartete Ausgabe? – akrun

+0

@akrun Ich aktualisiere die Frage, lass es mich wissen, wenn es noch nicht klar ist. – MFR

+0

Warum erwartest du 'cumsum (Wochentage (df2 $ Order_Date) ==" Friday ")', um dir die Wochennummer zu geben? Es wird Ihnen nur die kumulative Anzahl der Daten in dieser Spalte mitteilen, die Freitags waren (aber sie sind ungeordnet, und nicht jeder Tag oder jede Woche ist abgedeckt; was ist, wenn Sie einen oder zwei Freitage auslassen?). Das hat nichts mit der Wochennummer zu tun. – smci

Antwort

2

Der folgende Code berechnet die aktuelle Woche relativ zur Mindestwoche in den Daten. week2 verwendet modulare Arithmetik, um den Code prägnanter zu machen, obwohl die Wochennummern nicht immer exakt mit der direkten Berechnung von Jahres- und Wochennummern unter Verwendung von lubridate Funktionen übereinstimmen.

library(dplyr) 
library(lubridate) 

df2 %>% mutate(week = (year(Order_Date) - year(min(Order_Date)))*52 + 
       week(Order_Date) - week(min(Order_Date)), 
       week2 = (as.numeric(Order_Date) %/% 7) - (as.numeric(min(Order_Date)) %/% 7)) %>% 
    arrange(Order_Date) 
Order_Date week week2 
1 2015-10-23 0  0 
2 2015-10-27 0  0 
3 2015-11-01 1  1 
4 2015-11-07 2  2 
5 2015-11-11 2  2 
6 2015-11-14 3  3 
7 2015-12-17 8  8 
8 2016-01-05 10 10 
9 2016-01-20 12 12 
10 2016-01-30 14 14 
11 2016-02-18 16 17 
12 2016-03-13 20 20 
13 2016-03-31 22 23 
14 2016-04-04 23 23 
15 2016-04-15 25 25 
16 2016-05-08 28 28 
17 2016-05-10 28 28 
18 2016-07-27 39 39 
19 2016-10-01 49 49 
20 2016-10-11 50 50 
+1

Ich denke, wir können auch 'week()' aus 'lubridate' Paket verwenden – Aramis7d

+0

Ich habe 'week()' aus dem 'lubridate' Paket verwendet. – eipi10

2

cut.Date nimmt eine Intervallspezifikation (siehe ?cut.Date).

Ihre Daten umfassen ein ganzes Jahr, so dass, wenn Sie diese Woche wieder nennen wollen, wird dies die tatsächliche Anzahl der Wochen zählen:

library(dplyr) 
df2 %>% 
    mutate(week = cut.Date(Order_Date, breaks = "1 week", labels = FALSE)) %>% 
    arrange(Order_Date) 

#> Order_Date week 
#> 1 2015-10-23 1 
#> 2 2015-10-27 2 
#> 3 2015-11-01 2 
#> 4 2015-11-07 3 
#> 5 2015-11-11 4 
#> 6 2015-11-14 4 
#> 7 2015-12-17 9 
#> 8 2016-01-05 12 
#> 9 2016-01-20 14 
#> 10 2016-01-30 15 
#> 11 2016-02-18 18 
#> 12 2016-03-13 21 
#> 13 2016-03-31 24 
#> 14 2016-04-04 25 
#> 15 2016-04-15 26 
#> 16 2016-05-08 29 
#> 17 2016-05-10 30 
#> 18 2016-07-27 41 
#> 19 2016-10-01 50 
#> 20 2016-10-11 52 
+0

Vielen Dank. Beide Lösungen haben für mich perfekt funktioniert. – MFR

0

Alternativ könnten Sie das ISOweek Paket verwenden, die Daten zu konvertieren in das ISOweek-Format und verwenden Sie dann das zum Filtern Ihrer Ausgabe.

Beispielcode mit ISOweek Paket:

library(ISOweek) 
x <- paste0(2000:2017, "-01-01") 
x <- as.Date(x) 
y <- ISOweek(x) 
print(y) 
Verwandte Themen