1

いくつかの取引データをフィルタリングする必要があり、それを管理する方法がわかりません。これが私のデータの簡単な例です:

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_STMPPRTRD_EXCTN_DTASOF_CD == ""TRD_RPT_DTASOF_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_STMPPRTRD_EXCTN_DTASOF_CD == "A"TRD_RPTD_DTASOF_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_DTTRD_RPT_DTmult="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"との最初のペアをすぐに取得できる内部結合を使用したソリューションがおそらくある""ので、それらを削除できますか?

4

1 に答える 1

1

これが、残りを構築するための出発点です。キーとロールを自分で正しく理解したと仮定して、そのまま使用します。

行番号など、ある種のインデックスを追加します。

DT[, idx := .I]

# Now set your key and do the merge, but keep track of *all* the matching indices
# and pick one index from each match (not sure if you need nomatch - you'll have
# to experiment about that)
setkey(DT, "TM_STMP", "PR", "TRD_EXCTN_DT")
DT[ASOF_CD == ""][DT[ASOF_CD == "R", list(TM_STMP, PR, TRD_RPT_DT, idx.R = idx)],
                  roll = Inf, allow.cartesian = T][,
                  if (.GRP <= length(idx)) list(idx = idx[.GRP]),
                  by = c(key(DT), "idx.R")]
#               TM_STMP   PR TRD_EXCTN_DT idx.R idx
#1: 2011-01-02 09:30:01  8.9     20131109     3   2

idx.Rそしてidx、あなたが捨てたいインデックスです。

于 2013-11-05T19:36:14.337 に答える