R: Наименьшее ближайшее значение / дата из другого кадра данных - PullRequest
0 голосов
/ 26 июня 2018

У меня есть два фрейма данных:

Рейтинг:

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

Выход:

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

Я хотел бы добавить столбец данных во фрейм данных «Вывод», который называется «Рейтинг». Этот столбец взят из фрейма данных «Рейтинги» и принимает рейтинг на основе CUSIP и рейтинга, действующего на эту соответствующую дату.

Результат должен выглядеть следующим образом:

Выход_II (столбец Рейтинг будет создан):

Date        CUSIP   Rating (to be generated, based on data frame Rating)
01.05.2014  BAEU    A+
01.01.2015  BAEU    A+
01.02.2015  BAEU    A
01.01.2017  BAEU    A
02.01.2017  BAEU    A
15.03.2018  BAEU    BB
01.05.2010  CUOD    BBB
02.08.2012  CUOD    BB
01.01.2016  CUOD    BB
04.05.2018  CUOD    C
20.06.2010  BBAE    A
21.01.2012  BBAE    A
23.11.2015  BBAE    B-
01.01.2016  BBAE    B-
23.06.2016  BBAE    BBB

Я уже пробовал использовать dplyr и zoo. Выглядело это примерно так:

library(dplyr)
library(zoo)
Output_II = Output %>% 
  group_by(cusip, date) %>% 
  mutate(...)

Однако я не нашел способа завершить код.

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете полностью присоединиться к фреймам данных, упорядочить их по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...