2017-05-05 68 views
1

我有一个数据框,其中一列包含日期(某些日期多次出现)。我想按星期汇总日期。我能想到的最好办法是将日期舍入到最近的星期一。我怎样才能缩小日期?我怎样才能将这个日期列表转换成几周?R:向下舍入的日期到星期的第一天

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 

预期的输出应该是这样的:

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

的可能重复[R:如何判断在同一个星期日期(http://stackoverflow.com/questions/43775261/r-如何判断在同一周的日期) – Uwe

+1

似乎[this](http://stackoverflow.com/questions/26160117/changing-lubridate-function-to-start-on-monday-rather星期日)可能会有所帮助。 –

+1

你可以从你的日期中减去'wday'。 'lubridate'和'data.table'具有这个函数的实现。 – MichaelChirico

回答

0

cut()从基础R具有用于假定周的星期一开始默认(但可使用start.on.monday = FALSE被改变为星期日)Date类和POSIXt的对象的两种方法。

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 

注意cut()收益因素是完美的聚集由OP的要求:

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 ... 

然而,绘制累计值与ggplot2(如果有大量的星期可能使轴线杂波),从离散时间刻度切换到连续时间刻度可能会更好。然后,有必要强制因素回DatePOSIXct

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

随着lubridate你可以试试这个:

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上周日开始星期,所以要避免那些被包含在下周您必须在舍入前减去一个值,然后将值增加一天。

相关问题