2016-11-14 88 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") 

,我試圖根據一週(第0周,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(weekdays(df2 $ Order_Date)==「Friday」)'給你週數?它只會告訴你那個星期五發生的日期的累積數量(但是它們是無序的,並且不是每天或每週都被覆蓋;如果你跳過一個星期五或兩個星期呢?)。這與週數無關。 – 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

我想我們也可以從'lubridate'包中使用'week()' – Aramis7d

+0

我確實使用'lubridate'包中的'week()'。 – 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)