Объединение двух фреймов данных на основе ближайшего соответствия без точного соответствия - PullRequest
0 голосов
/ 25 мая 2018

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

#Example dataframes
set.seed(5)
df1 <- data.frame(date=as.Date(c('2001-01-02','2001-01-03','2001-01-06','2001-01-15','2001-01-18','2001-01-21')), 
                  val=rnorm(6))
df2 <- data.frame(date=as.Date(c('2001-01-01', '2001-01-08', '2001-01-15', '2001-01-21')), 
                  info=rnorm(4))
df1
        date         val
1 2001-01-02 -0.84085548
2 2001-01-03  1.38435934
3 2001-01-06 -1.25549186
4 2001-01-15  0.07014277
5 2001-01-18  1.71144087
6 2001-01-21 -0.60290798
df2
        date       info
1 2001-01-01 -0.4721664
2 2001-01-08 -0.6353713
3 2001-01-15 -0.2857736
4 2001-01-21  0.1381082

Таким образом, столбец date в приведенных выше кадрах данных не все совпадают, но я хочу, чтобы мой последний кадр данных выглядел следующим образом, который создается путем сопоставления date в df2 с его ближайшим date in df1:

df1merged
        date         val       info
1 2001-01-02 -0.84085548 -0.4721664
2 2001-01-03  1.38435934 -0.4721664
3 2001-01-06 -1.25549186 -0.6353713
4 2001-01-15  0.07014277 -0.2857736
5 2001-01-18  1.71144087 -0.2857736
6 2001-01-21 -0.60290798  0.1381082

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Это выглядит как довольно хороший вариант использования для объединения соединений (Несколько хороших примеров здесь и здесь и здесь ) вdata.table.

library(data.table)
## Convert to data.tables
setDT(df1);   setDT(df2)

## Set keys as date for both
setkey(df1, date);  setkey(df2, date)

## Perform a rolling join
df2[df1, roll = "nearest"]

#          date       info         val
# 1: 2001-01-02 -0.4721664 -0.84085548
# 2: 2001-01-03 -0.4721664  1.38435934
# 3: 2001-01-06 -0.6353713 -1.25549186
# 4: 2001-01-15 -0.2857736  0.07014277
# 5: 2001-01-18 -0.2857736  1.71144087
# 6: 2001-01-21  0.1381082 -0.60290798
0 голосов
/ 25 мая 2018

Вы могли бы сделать это ...

df1$info <- sapply(df1$date, function(x) df2$info[which.min(abs(df2$date-x))])

df1
        date         val       info
1 2001-01-02 -0.84085548 -0.4721664
2 2001-01-03  1.38435934 -0.4721664
3 2001-01-06 -1.25549186 -0.6353713
4 2001-01-15  0.07014277 -0.2857736
5 2001-01-18  1.71144087 -0.2857736
6 2001-01-21 -0.60290798  0.1381082
...