Условное соединение фреймов данных R - PullRequest
0 голосов
/ 09 октября 2018

У меня есть несколько простая проблема, которую я не могу правильно понять.

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

df1 <- data.frame(Dates.1 = seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), 'month'))

Dates.2 <- c(seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = '5 months'))

Vals <- c(10, 20, 15, 44, 70, 50)

df2 <- data.frame(Dates.2, Vals)

Что мне нужно сделать, это соединить df1 и df2, связав соответствующие значения в «Vals» для каждой даты в df1, которая меньше или равна датам в df2.Вывод должен быть таким, как показано ниже (я хочу найти способ сделать это в векторизованном виде):

df3 <- cbind(df1,Vals3. = c(10,10,10,10,10,20,20,20,20,20,15,15,15,15,15,
                        44,44,44,44,44,70,70,70,70,70,50,50,50,50))

Я пытался использовать соединения dplyr и пакет fuzzyjoin, но не смогчтобы получить это правильно (я новичок в R).Конечно, если кто-нибудь сможет найти решение с помощью этих пакетов, я буду более чем рад.Tks!

1 Ответ

0 голосов
/ 09 октября 2018

Комбинация dplyr и tidyr:

dplyr::left_join(df1,df2,by=c(Dates.1="Dates.2")) %>% 
tidyr::fill(Vals,.direction="down")

Результат:

      Dates.1 Vals
1  1999-01-01   10
2  1999-02-01   10
3  1999-03-01   10
4  1999-04-01   10
5  1999-05-01   10
6  1999-06-01   20
7  1999-07-01   20
8  1999-08-01   20
9  1999-09-01   20
10 1999-10-01   20
(...)

Альтернативой, кстати, будет пропустить создание df1 впервое место с помощью complete (из tidyr):

tidyr::complete(df2,Dates.2=seq.Date(as.Date('1999/1/1'), as.Date('2001/5/1'), by = 'month')) %>%
tidyr::fill(Vals,.direction="down")

Это даст тот же результат.

...