Извлечение информации из иерархической цепочки отношений - PullRequest
0 голосов
/ 28 ноября 2018

Первоначально данные представлялись в виде разных идентификаторов, имеющих отношение родитель-потомок, и каждая строка представляла различную сделку и ее идентификатор.Исходный набор данных, который мне нужно проанализировать, выглядит следующим образом.

dt.original.data <- structure(list(msg_seq_nb = c("0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494", 
                                  "0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541", "0024541", "0024569"
    ), orig_msg_seq_nb = c(NA, NA, "0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494", 
                           "0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541")
    , trc_st = c("T","C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R")
    , trd_rpt_dt = structure(c(15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987), class = "Date")
    , trd_rpt_tm = c(34838, 34853, 34853, 34863, 34863, 36231, 36231, 36305, 36305, 36328, 36328, 36330, 36330, 38831, 38831, 38925, 38925, 42984, 42984, 43002, 43002))
    , row.names = c(NA, -21L), class = c("data.table", "data.frame"))

   >  dt.original.data
    msg_seq_nb orig_msg_seq_nb trc_st trd_rpt_dt trd_rpt_tm
 1:    0005747            <NA>      T 2013-10-09      34838
 2:    0005747            <NA>      C 2013-10-09      34853
 3:    0005765         0005747      R 2013-10-09      34853
 4:    0005765         0005747      C 2013-10-09      34863
 5:    0005783         0005765      R 2013-10-09      34863
 6:    0005783         0005765      C 2013-10-09      36231
 7:    0008333         0005783      R 2013-10-09      36231
 8:    0008333         0005783      C 2013-10-09      36305

Как вы можете видеть, существует иерархическая связь между всеми сделками, введенными через соединение между orig_msg_seq_nb до msg_seq_nb.Поэтому мне удалось использовать рекурсивные объединения, чтобы в основном добавить совпадающие комбинации в одну строку.Это было сделано, используя ответ, который я дал на этот вопрос https://stackoverflow.com/a/53395260/5795592, и выдержка из этого результата выглядит следующим образом:

>      msg_seq_nb Initial.Trade.Status Initial.Trd.Rpt.Dt Initial.Trd.Rpt.Tm J2.Msg.Nb J2.Trade.Status J2.Trd.Rpt.Tm
   1:    0005747                    T         2013-10-09              34838   0005765               R         34853
   2:    0005747                    T         2013-10-09              34838   0005765               C         34863

Теперь я хотел бы проанализировать каждую цепочку отношений и хотел быизвлекать статус в конце каждой цепочки отношений.Таким образом, в случае приведенных выше примеров данных, поскольку последний введенный статус сделки в trc_st msg_seq_nb 0008333 равен C, мне необходимо удалить все msg_seq_nb иерархической цепочки.

На основеокончательный статус этой цепочки отношений - которая изначально была последовательностью различных сделок - определяет, останутся ли сделки с идентификаторами в исходном наборе данных или же необходимо обновить начальный статус с помощью конечного статуса, то есть статуса после последней рекурсивнойшаг.

Это как-то связано с этим вопросом SQL https://dba.stackexchange.com/questions/96098/finding-the-end-of-a-relationship-chain-optimally

1 Ответ

0 голосов
/ 28 ноября 2018

Теперь, когда вы предоставили ожидаемый результат, я бы сделал следующее:

library(data.table)

dt.original.data <- structure(
  list(
    msg_seq_nb = c("0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494",
                   "0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541", "0024541", "0024569"
), orig_msg_seq_nb = c(NA, NA, "0005747", "0005747", "0005765", "0005765", "0005783", "0005783", "0008333", "0008333", "0008494", 
                       "0008494", "0008556", "0008556", "0008560", "0008560", "0013622", "0013622", "0013797", "0013797", "0024541")
, trc_st = c("T","C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R", "C", "R")
, trd_rpt_dt = structure(c(15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987, 15987), class = "Date")
, trd_rpt_tm = c(34838, 34853, 34853, 34863, 34863, 36231, 36231, 36305, 36305, 36328, 36328, 36330, 36330, 38831, 38831, 38925, 38925, 42984, 42984, 43002, 43002))
, row.names = c(NA, -21L), class = c("data.table", "data.frame"))

final_transition <- dt.original.data[trc_st != "T" & orig_msg_seq_nb %in% dt.original.data[trc_st == "T"]$msg_seq_nb]
final_transition <- merge(dt.original.data[trc_st == "T", c("trc_st", "trd_rpt_tm", "msg_seq_nb")], final_transition, by.x = "msg_seq_nb", by.y = "orig_msg_seq_nb")

col_names <- c("msg_seq_nb", "Initial.Trade.Status", "Initial.Trd.Rpt.Dt", "Initial.Trd.Rpt.Tm", "J2.Msg.Nb", "J2.Trade.Status", "J2.Trd.Rpt.Tm")

setnames(final_transition, 
         c("msg_seq_nb", "trc_st.x", "trd_rpt_dt", "trd_rpt_tm.x", "msg_seq_nb.y", "trc_st.y", "trd_rpt_tm.y"),
         col_names)
setcolorder(final_transition, col_names)

final_transition
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...