Как накормить колонку объединением? (обновить объединение) - PullRequest
0 голосов
/ 07 октября 2019

У меня есть фрейм данных с финансовыми данными для индекса с именем S & P500 (дата, тикер, цена).

У меня есть другой фрейм данных с (дата, тикер, действие).

Action == "IN", когда тикер добавляется в индекс на дату

Action == "OUT", когда тикер удаляется из индекса на дату

И я хочу добавить 2 новых столбцана мой основной df, с TRUE для ключа (дата, тикер), когда пара найдена во втором df.

Сегодня у меня есть что-то вроде:

library(tidyverse)

Ticker = c("DOW","MSCI","BJS")
Action = c("IN","IN","OUT")
Date = c("2019-04-02", "2018-04-04","2010-04-29")

sp500_InOut = data.frame(Ticker, Action, Date)

Ticker = c("DOW", "DOW","MSCI", "MSCI","BJS","BJS")
ref.date = c("2019-04-02", "2018-04-04", "2018-04-04","2010-04-29", "2018-04-04","2010-04-29")
close = c(1,2,3,4,5,6)

sp500_OHLC = data.frame(Ticker, ref.date, close)

Тогда вЧтобы обновить столбцы sp500_OHLC $ IN и sp500_OHLC $ OUT, мне удалось присоединиться так:

#not working
left_join(sp500_OHLC, sp500_InOut, by = c("Ticker" = "Ticker", "ref.date" = "Date"))  
%>% mutate(IN <- ifelse(is.na(Action),FALSE, 
                       ifelse(Action == "IN", TRUE)
%>% mutate(OUT <- ifelse(is.na(Action),FALSE, 
                       ifelse(Action == "OUT", TRUE)

Но я не могу понять, теперь я могу обновить свои столбцы.

Спасибо! !

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вот как я бы это сделал:

library(tidyverse)

left_join(
  x = sp500_OHLC,
  y = sp500_InOut %>% 
    mutate(
      IN  = Action == "IN", ##True/False is implicit
      OUT = Action == "OUT"
    ) %>% 
    select(-Action),
  by = c("Ticker", "ref.date" = "Date") ## You don't need to set Ticker equal to itself since it's the same
) %>% 
  #replace_na(list("IN" = FALSE, "OUT" = FALSE)) %>% ## Option 1 (if you care about other NAs being preseved)
  replace(is.na(.), FALSE) ## Option 2 (if these are the only NAs)

Я обычно предпочитаю избегать if_else, потому что, особенно при вложении, он поддается непреднамеренным ошибкам. Плюс, если вы просто замените NA после присоединения одним из немногих вариантов, которые есть у dplyr, вам станет понятнее, что вы делаете с другим человеком, читающим ваш код, и вам потребуется меньше кода, что является плюсом. Если вы действительно хотите использовать операторы if / else, я бы предложил case_when, который позволяет вам явно указывать условия и результат каждого из них, поскольку он намного понятнее, чем вложенный набор if_else.

0 голосов
/ 08 октября 2019

Вот мое решение.

sp500_OHLC <- sp500_raw %>%  left_join(sp500_InOut, by = c("Ticker" = "Ticker", "ref.date" = "Date"))

sp500_OHLC <- sp500_OHLC %>% mutate(IN = if_else(is.na(Action),FALSE, if_else(Action == "IN", TRUE, FALSE))) 
sp500_OHLC <- sp500_OHLC %>% mutate(OUT = if_else(is.na(Action),FALSE, if_else(Action == "OUT", TRUE, FALSE)))


sp500_OHLC <- sp500_OHLC %>% select(Ticker, ref.date, IN, OUT, close)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...