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