0

a 、data.tableカテゴリCondition( Cat) 、およびDate.

行は、次の場合にのみ再計算される資格がありますCondition==TRUE。のすべての行の中で、それぞれがCondition==TRUE最高の行のみを選択する必要があります。DateCat

簡単な例:

     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の とを抽出する方法を見つけました。DateResult

    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]

速度/効率に関してどのソリューションを選択すべきか、何か推奨事項はありますか?

4

1 に答える 1