Условное соединение фреймов данных R
У меня есть довольно простая проблема, которую я не могу понять правильно.
У меня есть два фрейма данных, первый из которых содержит только даты (каждый месяц в течение нескольких лет), второй также содержит даты и некоторые другие данные, но только месяцы, за которые произошли изменения во второй переменной. Как ниже:
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 ответ
Сочетание 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
(...)