R:分组和汇总数据以查找参考日期之后的第 n 个最近的事件

R: Grouping and summarizing data to find the nth nearest event after date of reference

我一直在使用一个数据集,其中包含客户(身份)、帐户创建日期(日期输入)和客户使用的 GATE,以便在网站上下订单(Table A),但其中一些尝试失败了,这就是为什么第二个数据帧 (Table B) 与 CLIENT (identification) 一起提供的原因,ERROR_DATE 和 MAGIC_IP 标识错误作为旁注,所有 GATES 和所有 MAGIC_IP 将始终不同,即使这意味着相同的客户标识。

Table一个

GATE CLIENT DATE_ENTER
A 1 1
B 1 1
C 1 3
D 1 4
E 1 5
F 1 6
G 1 7
H 1 8
I 1 9
J 1 10
K 1 11
L 1 12
M 1 16

Table B

HOST CLIENT DATE_ERROR
14558556 1 2
14558557 1 3
14558558 1 4
14558559 1 5
14558560 1 6
14558561 1 7
14558562 3 8
14558563 2 9
14558564 3 10
14558565 3 11
14558566 1 12
14558567 1 13

我想要创建的是一个 table,我可以在其中立即看到每个“CLIENT”、“DATE ENTER”和“GATE”的 ERROR_DATE 和 MAGIC_IP 是什么之后或换句话说就是下一个。预期结果应如下所示:

GATE CLIENT DATE_ENTER DATE_ERROR MAGIC_IP
A 1 1 2 154
B 1 1 2 154
C 1 3 4 156
D 1 4 5 157
E 1 5 6 158
F 1 6 7 159
G 1 7 10 160
H 1 8 10 160
I 1 9 10 160
J 1 10 11 163
K 1 11 12 164
L 1 12 13 165
M 1 16 N.A N.A

在这个 table 中,我可以看到每个 GATE。客户和“DATE_ENTER”每个客户的下一个或最近的 MAGIC_IP 和 ERROR_DATE 是什么,非常感谢所有愿意帮助我的人,

我尝试了什么?

我在考虑按 CLIENT、DATE_ENTER 和 GATE 分组,然后按 CLIENT 加入两个 table,然后创建一个变量来减去所有日期并为每个组选择最小的正值作为索引来关联 MAGIC_IP 和 ERROR_DATE 的信息,但我目前似乎无法找到一种方法,谢谢大家的帮助

数据:

TableA<-tribble(~GATE,  ~CLIENT,    ~DATE_ENTER,
"A",    "1",    "1",
"B",    "1",    "1",
"C",    "1",    "3",
"D",    "1",    "4",
"E",    "1",    "5",
"F",    "1",    "6",
"G",    "1",    "7",
"H",    "1",    "8",
"I",    "1",    "9",
"J",    "1",    "10",
"K",    "1",    "11",
"L",    "1",    "12")

TableB<-tribble(~HOST,  ~CLIENT,    ~DATE_ERROR,
                "14558556", "1",    "2",
                "14558557", "1",    "3",
                "14558558", "1",    "4",
                "14558559", "1",    "5",
                "14558560", "1",    "6",
                "14558561", "1",    "7",
                "14558562", "3",    "8",
                "14558563", "2",    "9",
                "14558564", "3",    "10",
                "14558565", "3",    "11",
                "14558566", "1",    "12",
                "14558567", "1",    "13")

CLIENT和select加入TableATableBDATE_ERRORDATE_ENTER之间最小的正差。

library(dplyr)

TableA %>%
  mutate(row = row_number()) %>%
  left_join(TableB, by = 'CLIENT') %>%
  type.convert(as.is = TRUE) %>%
  group_by(row) %>%
  filter({tmp = DATE_ERROR - DATE_ENTER
          tmp == min(tmp[tmp > 0], na.rm = TRUE)
          }) %>%
  ungroup() %>%
  select(-row)