所以让我们采取以下data.table。它有日期和一列数字。我想得到每个日期的一周,然后汇总(总和)每两周。
Date <- as.Date(c("1980-01-01", "1980-01-02", "1981-01-05", "1981-01-05", "1982-01-08", "1982-01-15", "1980-01-16", "1980-01-17",
"1981-01-18", "1981-01-22", "1982-01-24", "1982-01-26"))
Runoff <- c(2, 1, 0.1, 3, 2, 5, 1.5, 0.5, 0.3, 2, 1.5, 4)
DT <- data.table(Date, Runoff)
DT
所以从那天起,我可以很容易地获得年份和星期。
DT[,c("Date_YrWeek") := paste(substr(Date,1,4), week(Date), sep="-")][]
我正在努力的是每两周汇总一次。 我以为我会得到每周的第一个日期并使用这些值进行过滤。不幸的是,那将是非常愚蠢的。
DT[,.(min(Date)),by=.(Date_YrWeek)][order(Date)]
最终结果将是每两周的总和。
weeks sum_value
1 and 2 ...
3 and 4 ...
5 and 6 ...
任何人都有一种有效的方法来使用data.table吗?
答案 0 :(得分:4)
使用tidyverse和lubridate:
library(tidyverse)
library(lubridate)
summary <- DT %>%
mutate(TwoWeeks = round_date(Date, "2 weeks")) %>%
group_by(TwoWeeks) %>%
summarise(sum_value = sum(Runoff))
summary
# A tibble: 9 × 2
TwoWeeks sum_value
<date> <dbl>
1 1979-12-30 3.0
2 1980-01-13 1.5
3 1980-01-20 0.5
4 1981-01-04 3.1
5 1981-01-18 0.3
6 1981-01-25 2.0
7 1982-01-10 2.0
8 1982-01-17 5.0
9 1982-01-24 5.5
Lubridate的round_date()将汇总您可以通过大小和单位指定的范围内的日期,在本例中为“2周”。 round_date()的输出是该时期的第一个日历日。
答案 1 :(得分:2)
1)将两周期间定义为从最小日期开始。然后我们可以得到每个这样的时期的总径流量。
DT[, .(sum_value = sum(Runoff)),
keyby = .(Date = 14 * (as.numeric(Date - min(Date)) %/% 14) + min(Date))]
给出以下内容,其中Date列是两周时间段第一天的日期。
Date sum_value
1: 1980-01-01 3.0
2: 1980-01-15 2.0
3: 1980-12-30 3.1
4: 1981-01-13 2.3
5: 1981-12-29 2.0
6: 1982-01-12 6.5
7: 1982-01-26 4.0
2)如果您更喜欢第一栏问题中显示的文字,那么:
DT[, .(sum_value = sum(Runoff)),
keyby = .(two_week = as.numeric(Date - min(Date)) %/% 14)][
, .(weeks = paste(2*two_week + 1, "and", 2*two_week + 2), sum_value)]
,并提供:
weeks sum_value
1: 1 and 2 3.0
2: 3 and 4 2.0
3: 53 and 54 3.1
4: 55 and 56 2.3
5: 105 and 106 2.0
6: 107 and 108 6.5
7: 109 and 110 4.0
更新:修改并添加(2)。