Добавить следующую ближайшую дату из второй таблицы, совпадающей по id в R - PullRequest
0 голосов
/ 27 января 2020

Скажем, у меня есть таблица данных со списком идентификационных номеров и датой-временем. Каждый идентификатор может появляться более одного раза с разной датой-временем (пример данных в таблице 1). Я хочу добавить столбец в таблицу 1 с датой из второй таблицы, совпадающей по номеру идентификатора, которая находит ближайшую дату в таблице 2, встречающуюся после даты в таблице 1.

Опять может быть несколько дат для одного и того же идентификационного номера в таблице 2, поэтому я просто хочу добавить ближайшие ближайшие данные. Я полагаю, что мне нужно написать a для l oop, но я не могу найти способ запустить совпадение для каждого идентификационного номера, а затем выбрать только 1 результат для отображения в столбце даты. Другое условие, которое мне нужно добавить, состоит в том, что если в таблице 2 нет даты до следующей даты для того же идентификатора в таблице 1, она должна просто вернуть NA.

Каков наилучший способ продолжить? Заранее спасибо всем

Table1
id_code     inspection_date
1     600 2019-10-10 18:24:32
2     600 2019-10-10 23:55:13
3     600 2019-08-07 13:42:45
4     601 2019-08-16 15:45:54
5     601 2019-08-17 17:25:34
6     602 2019-08-19 12:34:31
7     603 2019-11-03 16:30:31
8     603 2019-11-03 19:01:01
Table 2
id_code2        confirm_date
1       598 2019-09-09 13:24:45
2       600 2019-10-10 19:35:37
3       600 2019-10-11 01:23:58
4       600 2019-08-07 16:30:01
5       601 2019-08-17 02:30:35
6       601 2019-08-17 22:45:46
7       601 2019-08-19 19:12:18
8       602 2019-12-01 12:12:12
9       602 2019-12-14 23:25:35
10      602 2019-12-29 03:30:31
11      603 2019-12-30 06:35:35
12      603 2019-12-31 01:02:34
13      605 2019-12-31 17:24:46

Blockquote

1 Ответ

0 голосов
/ 27 января 2020

Вот решение, которое будет работать, но я не уверен, что оно будет самым быстрым из возможных:

table1$confirm_date<-as.POSIXct(mapply(function(x,y) sort(table2$confirm_date[table2$id_code2==x & 
      table2$confirm_date>y])[1], table1$id_code, table1$inspection_date),
      origin="1970-01-01 00:00.00 UTC")

Это переходит по вашей первой таблице один за другим и находит соответствующую дату из таблицы 2, которая разделяет тот же идентификатор и имеет ближайшую (т. е. первую) дату, превышающую его.

Вывод:

  id_code     inspection_date        confirm_date
1     600 2019-10-10 18:24:32 2019-10-10 19:35:37
2     600 2019-10-10 23:55:13 2019-10-11 01:23:58
3     600 2019-08-07 13:42:45 2019-08-07 16:30:01
4     601 2019-08-16 15:45:54 2019-08-17 02:30:35
5     601 2019-08-17 17:25:34 2019-08-17 22:45:46
6     602 2019-08-19 12:34:31 2019-12-01 12:12:12
7     603 2019-11-03 16:30:31 2019-12-30 06:35:35
8     603 2019-11-03 19:01:01 2019-12-30 06:35:35

(в ваших выборочных данных не было случая, когда не было подтвержденной даты позже даты инспекции, но я удостоверился, и он действительно возвращает NA в соответствии с требованиями).

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