2017-06-07 23 views
2

問題はHow do I do a conditional sum which only looks between certain date criteriaと似ていますが、わずかに異なります。その答えは現在の問題には当てはまりません。振り返ってみると、それぞれの日に、グループごとに:グループごとの過去のウィンドウサイズの日付の合計

input <- read.table(text=" 
2017-04-01  A  1 
2017-04-02  B  2 
2017-04-02  B  2 
2017-04-02  C  2 
2017-04-02  A  2 
2017-04-03  C  3 
2017-04-04  A  4 
2017-04-05  B  5 
2017-04-06  C  6 
2017-04-07  A  7 
2017-04-08  B  8 
2017-04-09  C  9") 
colnames(input) <- c("Date","Group","Score") 

ルール:主な違いは、各グループに基づく日付列が必ずしも

入力を(すなわち、特定の日付が不足していることもある)、完全ではないかもしれないということです3カレンダー日付(現在の日付を含む)。合計を計算する。

予想される出力:

Date Group 3DaysSumPerGroup 
    2017-04-01  A    1 #1 previous two dates are not available. partial is allowed 
    2017-04-02  A    3 #2+1 both 4-01 and 4-02 are in the range 
    2017-04-04  A    6 #4+2 
    2017-04-07  A    7 #7 
    2017-04-02  B    4 # 2+2 at the same day 
    2017-04-05  B    5 
    2017-04-08  B    8 
    2017-04-02  C    2 
    2017-04-03  C    5 
    2017-04-06  C    6 
    2017-04-09  C    9 

私は部分的= Tとrollapply使用しようとしましたが、結果は正しいようではありません。

input %>% 
    group_by(Group) %>% 
    arrange(Date) %>% mutate("3DaysSumPerGroup"=rollapply(data=Score,width=3,align="right",FUN=sum,partial=T,fill=NA,rm.na=T)) 
+0

はおそらく生成する 'cut'を使用しますウィンドウグループ – akrun

+0

グループBの最初の値が4の理由は?そのグループの以前の値はありません –

+0

@DavidArenburg、Bは同じ日に2つのレコードを持っています – HappyCoding

答えて

4

ここで新しい非エクイはとdata.table(v1.9.8の+)でby = .EACHIの機能を使用して参加する(おそらく効率的)なソリューションです

library(data.table) #v1.10.4 

## Convert to a proper date class, and add another column in order to define the range 
setDT(input)[, c("Date", "Date2") := { 
    Date = as.IDate(Date) 
    Date2 = Date - 2L 
    .(Date, Date2) 
}] 

## Run a non-equi join against the unique Date/Group combination in input 
## Sum the Scores on the fly 
## You can ignore the second Date column 

input[unique(input, by = c("Date", "Group")), ## This removes the dupes 
     on = .(Group, Date <= Date, Date >= Date2), ## The join condition 
     .(Score = sum(Score)), ## sum the scores 
     keyby = .EACHI] ## Run the sum by each row in unique(input, by = c("Date", "Group")) 

#  Group  Date  Date Score 
# 1:  A 2017-04-01 2017-03-30  1 
# 2:  A 2017-04-02 2017-03-31  3 
# 3:  A 2017-04-04 2017-04-02  6 
# 4:  A 2017-04-07 2017-04-05  7 
# 5:  B 2017-04-02 2017-03-31  4 
# 6:  B 2017-04-05 2017-04-03  5 
# 7:  B 2017-04-08 2017-04-06  8 
# 8:  C 2017-04-02 2017-03-31  2 
# 9:  C 2017-04-03 2017-04-01  5 
# 10:  C 2017-04-06 2017-04-04  6 
# 11:  C 2017-04-09 2017-04-07  9 
+0

あなたはkeyby = .EACHIで少し説明できますか? – HappyCoding

+0

近くにコメントがあります。 (input、by = c( "Date"、 "Group")) '*"の各行の 'input'のすべての結合レコードを合計することを意味します。 –

+0

Group1、Group2の2つのカラムの場合2番目のグループを現在のソリューションに追加する方法を知っていますか? – HappyCoding

関連する問題