いくつかの取引データをフィルタリングする必要があり、それを管理する方法がわかりません。これが私のデータの簡単な例です:
set.seed(1)
start.date <- as.POSIXct("2011-01-01 09:30:01", tz = "GMT")
dates <- seq(start.date, length = 10, by = "days")
tr_dt <- as.integer(gsub("-", "", as.Date(dates)))
DT <- data.table(TM_STMP = dates, PR = format(rlnorm(10, 2), digits = 2), VOL = rpois(10, 200), TRD_EXCTN_DT = tr_dt, TRD_RPT_DT = tr_dt, ASOF_CD = "")
DT[5] <- DT[2]
DT[6] <- DT[2]
DT[7] <- DT[2]
DT[8] <- DT[2]
DT$TRD_RPT_DT[5] <- 20131109
DT$TRD_RPT_DT[6] <- 20131109
DT$TRD_RPT_DT[7] <- 20131109
DT$TRD_RPT_DT[8] <- 20131109
DT$ASOF_CD[5] <- "R"
DT$ASOF_CD[6] <- "A"
DT$ASOF_CD[7] <- "R"
DT$ASOF_CD[8] <- "A"
DT
TM_STMP PR VOL TRD_EXCTN_DT TRD_RPT_DT ASOF_CD
1: 2011-01-01 09:30:01 3.9 221 20131105 20131105
2: 2011-01-02 09:30:01 8.9 205 20131106 20131106
3: 2011-01-03 09:30:01 3.2 191 20131107 20131107
4: 2011-01-04 09:30:01 36.4 195 20131108 20131108
5: 2011-01-02 09:30:01 8.9 205 20131106 20131109 R
6: 2011-01-02 09:30:01 8.9 205 20131106 20131109 A
7: 2011-01-02 09:30:01 8.9 205 20131106 20131109 R
8: 2011-01-02 09:30:01 8.9 205 20131106 20131109 A
9: 2011-01-09 09:30:01 13.1 208 20131113 20131113
10: 2011-01-10 09:30:01 5.4 212 20131114 20131114
私がしなければならないことは次のとおりです。
1) を使用してすべての行を取得し、に基づいて、および(for ) < (for )ASOF_CD != "R"
を使用して行に一致させます。1 つだけが 1 つに一致します。これにより、次のようになります。ASOF_CD == ""
TM_STMP
PR
TRD_EXCTN_DT
ASOF_CD == ""
TRD_RPT_DT
ASOF_CD == "R"
""
"R"
TM_STMP PR VOL TRD_EXCTN_DT TRD_RPT_DT ASOF_CD
2: 2011-01-02 09:30:01 8.9 205 20110102 20110102
5: 2011-01-02 09:30:01 8.9 205 20110102 20131109 R
2) これらの一致 ( と の両方) を data.table から削除"R"
し""
ます。次に、data.table は次のようになります。
TM_STMP PR VOL TRD_EXCTN_DT TRD_RPT_DT ASOF_CD
1: 2011-01-01 09:30:01 3.9 221 20110101 20110101
2: 2011-01-03 09:30:01 3.2 191 20110103 20110103
3: 2011-01-04 09:30:01 36.4 195 20110104 20110104
4: 2011-01-02 09:30:01 8.9 205 20110102 20131109 A
5: 2011-01-02 09:30:01 8.9 205 20110102 20131109 R
6: 2011-01-02 09:30:01 8.9 205 20110102 20131109 A
7: 2011-01-09 09:30:01 13.1 208 20110109 20110109
8: 2011-01-10 09:30:01 5.4 212 20110110 20110110
3) 残りの行をすべて取得し、 based on 、and (for ) <= (for )ASOF_CD == "R"
の行と一致させます。1 つだけが 1 つに一致します。一致は次のとおりです。ASOF_CD == "A"
TM_STMP
PR
TRD_EXCTN_DT
ASOF_CD == "A"
TRD_RPTD_DT
ASOF_CD == "R"
"A"
"R"
TM_STMP PR VOL TRD_EXCTN_DT TRD_RPT_DT ASOF_CD
4: 2011-01-02 09:30:01 8.9 205 20110102 20131109 A
5: 2011-01-02 09:30:01 8.9 205 20110102 20131109 R
4) これらの一致 ( と の両方) を data.table から削除"R"
し"A"
ます。最終結果は次の data.table です。
TM_STMP PR VOL TRD_EXCTN_DT TRD_RPT_DT ASOF_CD
1: 2011-01-01 09:30:01 3.9 221 20110101 20110101
2: 2011-01-03 09:30:01 3.2 191 20110103 20110103
3: 2011-01-04 09:30:01 36.4 195 20110104 20110104
4: 2011-01-02 09:30:01 8.9 205 20110102 20131109 A
5: 2011-01-09 09:30:01 13.1 208 20110109 20110109
6: 2011-01-10 09:30:01 5.4 212 20110110 20110110
最初のタスクについて考え、次を使用してみました。
setkey(DT, "TM_STMP", "PR", "TRD_EXCTN_DT")
DT[ASOF_CD == ""][DT[ASOF_CD == "R", list(TM_STMP, PR, TRD_RPT_DT)], roll = Inf, nomatch = 0, mult = "first"]
<と theをroll=Inf
一致させるために引数を使用して、で 1 つの一致のみを取得しますが、これにより 2 つの一致が得られます。TRD_EXCTN_DT
TRD_RPT_DT
mult="first"
DT[ASOF_CD == ""]
TM_STMP PR TRD_EXCTN_DT VOL TRD_RPT_DT ASOF_CD
1: 2011-01-02 09:30:01 8.9 20131109 205 20131106
2: 2011-01-02 09:30:01 8.9 20131109 205 20131106
"R"
さらに、手順 1) と 2) について、 と一致した を取得するために、逆に照合する方法がわかりません""
。"R"
との最初のペアをすぐに取得できる内部結合を使用したソリューションがおそらくある""
ので、それらを削除できますか?