Все эти решения используют базу R и отличаются только определением и маркировкой недель.
1) cut
даты в неделях и затем агрегируются по ним. Недели начинаются в понедельник, но вы можете добавить start.on.monday=FALSE
к cut
, чтобы начать их в воскресенье, если хотите.
Week <- as.Date(cut(DF$Date, "week"))
aggregate(Frequency ~ Week, DF, sum)
## Week Frequency
## 1 2013-12-30 549
## 2 2014-01-06 418
2) Если вы предпочитаете определить неделю как 7 дни, начинающиеся с DF $ Date [1], и пометьте их в соответствии с первой датой на этой неделе, затем используйте это. (Добавьте 6 к Week
, если предпочитаете последнюю дату недели.)
weekno <- as.numeric(DF$Date - DF$Date[1]) %/% 7
Week <- DF$Date[1] + 7 * weekno
aggregate(Frequency ~ Week, DF, sum)
## Week Frequency
## 1 2014-01-01 690
## 2 2014-01-08 277
3) или если вы предпочитаете пометить ее первой датой, существующей в DF
на этой неделе используйте это. Это и последнее определение недели дают тот же результат, если нет пропущенных дат, как здесь. (Если вам нужна последняя существующая дата недели, а не первая, замените match
на findInterval
.)
weekno <- as.numeric(DF$Date - DF$Date[1]) %/% 7
Week <- DF$Date[match(weekno, weekno)]
aggregate(Frequency ~ Week, DF, sum)
## Week Frequency
## 1 2014-01-01 690
## 2 2014-01-08 277
Примечание
Предполагается, что ввод в воспроизводимой форме быть:
Lines <- "Date Frequency
1 2014-01-01 179
2 2014-01-02 82
3 2014-01-03 89
4 2014-01-04 109
5 2014-01-05 90
6 2014-01-06 66
7 2014-01-07 75
8 2014-01-08 106
9 2014-01-09 89
10 2014-01-10 82"
DF <- read.table(text = Lines)
DF$Date <- as.Date(DF$Date)