2016-11-14 5 views
3

Я хочу пометить свои данные на основании их недели. Это мои данные:Группа по неделям в 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") 

, и я попытался обозначить их на основе недели (0th неделю, 1-я неделя и ....), и я хочу, чтобы сгруппировать мои данные на неделю позже

И Я попытался это:

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


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

это не дает мне правильный результат, и я следующий вывод, который является фантастическим

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 

В идеале, я хотел бы иметь этот выход:

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 

, так как номер строки 8 происходит 10 неделю после строки номер 1, но также и решение, которое генерирует следующий мой второй вариант, который показывает эти данные не являются в в той же самой неделе:

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

Что вы ожидаемый результат? – akrun

+0

@akrun Я обновляю вопрос, пожалуйста, дайте мне знать, если это еще не ясно. – MFR

+0

Почему вы ожидаете 'cumsum (будние дни (df2 $ Order_Date) ==" Пятница ")', чтобы дать вам недельный номер? Он расскажет вам только о совокупном количестве дат в этой колонке, которые были пятницами (но они неупорядочены, а не каждый день или неделю покрыты, а что, если вы пропустите пятницу или две?). Это не имеет никакого отношения к номеру недели. – smci

ответ

2

Код ниже рассчитывает текущую неделю относительно минимальной недели в данных. week2 использует модульную арифметику, чтобы сделать код более кратким, хотя номера недель не всегда совпадают с прямым вычислением лет и чисел с использованием lubridate функций.

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

Я думаю, мы также можем использовать 'week()' из пакета lubridate' – Aramis7d

+0

Я использовал 'week()' из пакета 'lubridate'. – eipi10

2

cut.Date принимает интервал спецификации (см ?cut.Date).

Ваши данные охватывают целый год, так что если вы не хотите, чтобы повторно назвать те недели, это будет подсчитать фактическое количество недель:

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

Большое вам спасибо. Оба решения отлично работали для меня. – MFR

0

В качестве альтернативы можно использовать ISOweek пакет для преобразования даты в формате ISOweek, а затем использовать это для фильтрации вашего вывода.

Пример кода с использованием ISOweek пакета:

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