1

次の行のいくつかの平均を含む新しい列をデータ テーブルに追加しようとしています。ただし、平均のために選択される行数は、行のタイム スタンプによって異なります。

ここにいくつかのテストデータがあります:

DT<-data.table(Weekstart=c(1,2,2,3,3,4,5,5,6,6,7,7,8,8,9,9),Art=c("a","b","a","b","a","a","a","b","b","a","b","a","b","a","b","a"),Demand=c(1:16))    

それぞれの週の 3 週間前までの週 (「Weekstart」) に発生したすべての需要の平均を含む列を追加したいと考えています (実際の週を除いて Art でグループ化)。

Zoo-library の rollapply を使用すると、次のように機能します。

setorder(DT,-Weekstart)
DT[,RollMean:=rollapply(Demand,width=list(1:3),partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]

ただし、問題は、一部のデータが欠落していることです。この例では、アート b のデータには 4 週目がなく、4 週目には需要がありません。前の 3 つの行ではなく、前の 3 週間の平均が必要なため、平均は間違っています。代わりに、第 6 週の Art b の結果は次のようになります。

DT[Art=="b"&Weekstart==6,RollMean:=6]

(第 5 週と第 3 週のみがカウントされるため、14/3 ではなく 6: (8+4)/2)

これまでに私が疲れたのは次のとおりです。

次の行の週の最小値をループして、各行の「幅」の幅 (新しい列「ロール幅」) を定義するベクトルを作成することができます。

i<-3
DT[,rollwidth:=Weekstart-rollapply(Weekstart,width=list(1:3),partial=TRUE,FUN=min,align="left",fill=1),.(Art)]

while (max(DT[,Weekstart-rollapply(Weekstart,width=list(1:i),partial=TRUE,FUN=min,align="left",fill=NA),.(Art)][,V1],na.rm=TRUE)>3) {
i<-i-1
DT[rollwidth>3,rollwidth:=i]
}

しかし、それは非常に専門的ではないようです(私の貧弱なスキルを許してください)。残念ながら、幅とロール幅を指定した rollapply は意図したとおりに機能しません (「ロール幅」はテーブル内のすべてのロール幅と見なされるため、警告が生成されます)。

DT[,RollMean2:=rollapply(Demand,width=list(1:rollwidth),partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]

仕事とは何か

DT[,RollMean3:=rollapply(Demand,width=rollwidth,partial=TRUE,FUN=mean,align="left",fill=NA),.(Art)]

しかし、繰り返しになりますが、平均には実際の週が含まれています(私が望むものではありません)。

引数の幅に行数の代わりに基準を適用する方法を知っている人はいますか (つまり、週の差は <= 3 になります)。どんな提案でも大歓迎です!

4

0 に答える 0