R: объединить два набора данных в пределах диапазона дат - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть один набор данных x, который выглядит примерно так:

id  |      date
 1  |   2014-02-04
 1  |   2014-03-15
 2  |   2014-02-04
 2  |   2014-03-15

И я хотел бы объединить его с другим набором данных, y, id и date. Но с date из x, равным или предшествующим date в наборе данных y для каждого наблюдения. Набор данных y выглядит следующим образом:

id  |      date      |   value
 1  |   2014-02-07   |    100
 2  |   2014-02-04   |     20
 2  |   2014-03-22   |     80

Так что я бы хотел, чтобы мой последний набор данных был:

id  |      date.x    |    date.y      |   value
 1  |   2014-02-04   |  2014-02-07    |    100
 1  |   2014-03-15   |                |     
 2  |   2014-02-04   |  2014-02-04    |     20
 2  |   2014-03-15   |  2014-03-22    |     80

У меня действительно нет подсказок о том, как подойти к чему-то подобномуЛюбая помощь приветствуется. Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Это просто в data.table, используя roll -аргумент

. Сначала создайте пример данных с фактическими датами

library( data.table )

DT1 <- fread("id  |      date
1  |   2014-02-04
1  |   2014-03-15
2  |   2014-02-04
2  |   2014-03-15")

DT2 <- fread("id  |      date      |   value
 1  |   2014-02-07   |    100
 2  |   2014-02-04   |     20
 2  |   2014-03-22   |     80")

DT1[, date := as.Date( date ) ]
DT2[, date := as.Date( date ) ]

, теперь выполните обновление соединения на DT1,где столбцы date.y и value являются результатом объединения (влево) от DT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ].
Этот код объединяет два столбца, id и date, аргумент roll -Infиспользуется на последнем (т.е. date). Чтобы убедиться, что возвращается date -значение из DT2, а не date из DT1, мы запрашиваем x.date вместо date (который возвращает date -значение из DT1)

#rolling update join
DT1[, c("date.y", "value") := DT2[ DT1, .( x.date, value), on = .(id, date), roll = -Inf ]][]

#    id       date     date.y value
# 1:  1 2014-02-04 2014-02-07   100
# 2:  1 2014-03-15       <NA>    NA
# 3:  2 2014-02-04 2014-02-04    20
# 4:  2 2014-03-15 2014-03-22    80
0 голосов
/ 11 ноября 2019

Другим вариантом является full_join на год и месяц .

Сначала нам нужно добавить дополнительный столбец, который извлекает месяц и год из dateстолбец:

library(zoo)
library(dplyr)

xx <- x %>% 
  mutate(y_m = as.yearmon(date))

yy <- y %>% 
  mutate(y_m = as.yearmon(date))

Тогда нам нужно полностью объединиться с помощью id и y_m:

out <- full_join(xx,yy, by = c("id","y_m")) %>% 
  select(-y_m)

> out
# A tibble: 4 x 4
     id date.x     date.y     value
  <dbl> <date>     <date>     <dbl>
1     1 2014-02-04 2014-02-07   100
2     1 2014-03-15 NA            NA
3     2 2014-02-04 2014-02-04    20
4     2 2014-03-15 2014-03-22    80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...