2017-05-05 64 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上週日開始星期,所以要避免那些被包含在下週您必須在舍入前減去一個值,然後將值增加一天。

相關問題