2017-08-05 95 views
0

因此我們來看下面的data.table。它有日期和一列數字。我想獲得每個日期的一週,然後每兩週彙總(總和)。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?

回答

1

隨着tidyverse和lubridate:

library(tidyverse) 
library(lubridate) 

summary <- DT %>% 
       mutate(TwoWeeks = round_date(DT$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

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)。