a 、data.table
カテゴリCondition
( Cat
) 、およびDate
.
行は、次の場合にのみ再計算される資格がありますCondition==TRUE
。のすべての行の中で、それぞれがCondition==TRUE
最高の行のみを選択する必要があります。Date
Cat
簡単な例:
DF = data.frame(Cat=rep(c("A","B","C"),each=3), Date=rep(c("01-08-2013","01-07-2013","01-04-2013"),3),
Condition=c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE),
Data1=c(1:9), Data2=rep(c(1:3),3), Result=c(1:1))
DF$Date = as.Date(DF$Date , "%m-%d-%Y")
DT = data.table(DF)
DT
Cat Date Condition Data1 Data2 Result
1: A 2013-01-08 TRUE 1 1 1
2: A 2013-01-07 TRUE 2 2 1
3: A 2013-01-04 FALSE 3 3 1
4: B 2013-01-08 FALSE 4 1 1
5: B 2013-01-07 FALSE 5 2 1
6: B 2013-01-04 FALSE 6 3 1
7: C 2013-01-08 FALSE 7 1 1
8: C 2013-01-07 FALSE 8 2 1
9: C 2013-01-04 TRUE 9 3 1
を再計算する必要がある行Cat
の とを抽出する方法を見つけました。Date
Result
setkey(DT, Condition, Cat, Date)
DT[J(TRUE), max(Date), by=Cat]
Cat V1
1: A 2013-01-08
2: C 2013-01-04
Result
ただし、これらの行の new を計算する方法がわかりません。この単純化された例では、 newResult
は である必要がありますData1+Data2
。
編集:
eddiの答えに触発されて、さらに2つの可能な解決策を思いつきました:
を使用したアプローチ.I
:
DT[DT[Condition==TRUE , .I[which.max(Date)], by=Cat][[2]], Result:=Data1+Data2]
使用するアプローチ.SD
(eddiの注意事項を参照):
max_dates=DT[Condition==TRUE , .SD[which.max(Date)], by=Cat]
setkey(DT, Cat, Date)
DT[max_dates, Result:=Data1 + Data2]
速度/効率に関してどのソリューションを選択すべきか、何か推奨事項はありますか?