Вы можете полностью присоединиться к фреймам данных, упорядочить их по CUSIP и Date и использовать функцию na.locf () из zoo, чтобы перенести последнее наблюдение за Rating для заполнения NA. Поскольку вы договорились о CUSIP и дате, отсутствующие рейтинги будут заменены соответствующими наблюдениями за рейтингами. Наконец, вам нужно отфильтровать результирующий кадр данных, чтобы он содержал только строки из исходного выходного кадра данных. Безопасным методом для этого последнего шага может быть right_join с исходным Output, который также гарантирует, что Output расположен в том же порядке, что и первоначально.
library(dplyr)
library(zoo)
Output %>%
full_join(Ratings) %>%
arrange(CUSIP, Date) %>%
mutate(Rating = na.locf(Rating)) %>%
right_join(Output)
Date CUSIP Rating
1 2014-05-01 BAEU A+
2 2015-01-01 BAEU A+
3 2015-02-01 BAEU A
4 2017-01-01 BAEU A
5 2017-01-02 BAEU A
6 2018-03-15 BAEU BB
7 2010-05-01 CUOD BBB
8 2012-08-02 CUOD BB
9 2016-01-01 CUOD BB
10 2018-05-04 CUOD C
11 2010-06-20 BBAE A
12 2012-01-21 BBAE A
13 2015-11-23 BBAE B-
14 2016-01-01 BBAE B-
15 2016-06-23 BBAE BBB
ДАННЫЕ:
Ratings <- read.table(text = "CUSIP Date Rating
BAEU 01.01.2014 A+
BAEU 30.01.2015 A
BAEU 28.02.2017 BB
BAEU 28.03.2018 BB
CUOD 01.03.2010 BBB
CUOD 02.03.2012 BB
CUOD 03.03.2016 AA
CUOD 04.03.2018 C
BBAE 20.06.2009 A
BBAE 21.06.2012 A+
BBAE 22.11.2015 B-
BBAE 23.06.2016 BBB", h = T )
Output <- read.table(text = "Date CUSIP
01.05.2014 BAEU
01.01.2015 BAEU
01.02.2015 BAEU
01.01.2017 BAEU
02.01.2017 BAEU
15.03.2018 BAEU
01.05.2010 CUOD
02.08.2012 CUOD
01.01.2016 CUOD
04.05.2018 CUOD
20.06.2010 BBAE
21.01.2012 BBAE
23.11.2015 BBAE
01.01.2016 BBAE
23.06.2016 BBAE", h = T)
Ratings$Date <- as.Date(Ratings$Date, "%d.%m.%Y")
Output$Date <- as.Date(Output$Date, "%d.%m.%Y")
Исходя из комментариев, приведенный ниже код может быть безопаснее в случае, если не все CUSIPS на выходе имеют рейтинг в рейтингах до первой даты CUSIP на выходе. Кроме того, данные, которые я использовал, немного изменены, чтобы показать, что происходит:
Ratings <- read.table(text = "CUSIP Date Rating
BAEU 01.01.2014 A+
BAEU 30.01.2015 A
BAEU 28.02.2017 BB
BAEU 28.03.2018 BB
CUOD 01.03.2010 BBB
CUOD 02.03.2012 BB
CUOD 03.03.2016 AA
CUOD 04.03.2018 C
BBAE 20.06.2009 A
BBAE 21.06.2012 A+
BBAE 22.11.2015 B-
BBAE 23.06.2016 BBB
TEST 01.01.2018 AAA", h = T )
Output <- read.table(text = "Date CUSIP
01.05.2014 BAEU
01.01.2015 BAEU
01.02.2015 BAEU
01.01.2017 BAEU
02.01.2017 BAEU
15.03.2018 BAEU
01.05.2010 CUOD
02.08.2012 CUOD
01.01.2016 CUOD
04.05.2018 CUOD
20.06.2010 BBAE
21.01.2012 BBAE
23.11.2015 BBAE
01.01.2016 BBAE
23.06.2016 BBAE
01.01.2017 TEST
01.01.2019 TEST", h = T)
Ratings$Date <- as.Date(Ratings$Date, "%d.%m.%Y")
Output$Date <- as.Date(Output$Date, "%d.%m.%Y")
library(dplyr)
library(zoo)
Output %>%
full_join(Ratings) %>%
arrange(CUSIP, Date) %>%
group_by(CUSIP) %>%
mutate(Rating = na.locf(Rating, na.rm = F)) %>%
right_join(Output)
Date CUSIP Rating
<date> <fctr> <fctr>
1 2014-05-01 BAEU A+
2 2015-01-01 BAEU A+
3 2015-02-01 BAEU A
4 2017-01-01 BAEU A
5 2017-01-02 BAEU A
6 2018-03-15 BAEU BB
7 2010-05-01 CUOD BBB
8 2012-08-02 CUOD BB
9 2016-01-01 CUOD BB
10 2018-05-04 CUOD C
11 2010-06-20 BBAE A
12 2012-01-21 BBAE A
13 2015-11-23 BBAE B-
14 2016-01-01 BBAE B-
15 2016-06-23 BBAE BBB
16 2017-01-01 TEST <NA>
17 2019-01-01 TEST AAA