Слияние данных с использованием left_join на основе условия - PullRequest
3 голосов
/ 29 апреля 2020

У меня есть два фрейма данных, которые я пытаюсь объединить.

«данные» выглядят так:

    Filled_Ticker2LP publishYear              CO_1_Name
 1:             SONC        2005             sonic corp
 2:             SONC        2005             sonic corp
 3:             <NA>        2005   cascade bancorp inc.
 4:              JCP        2005  jc penney company inc

«комп» выглядит так:

   tic   fyear conm           
   <chr> <int> <chr>          
 1 JCP    2004 penney (j c) co
 2 JCP    2005 penney (j c) co
 3 JCP    2006 penney (j c) co
 4 JCP    2007 penney (j c) co
 5 JCP    2008 penney (j c) co

Я хочу объединить эти два набора данных, используя left_join (или что-то из пакета data.table et c.)

В настоящее время я могу присоединиться к нему на основе года и символа, такого как SONC , JCP.

mergedData <- data %>% 
  left_join(comp, by = c("Filled_Ticker2LP" = "tic", "publishYear" = "fyear"))

"mergedData" выглядит следующим образом:

    Filled_Ticker2LP publishYear              CO_1_Name            conm
 1:             SONC        2005             sonic corp      sonic corp
 2:             SONC        2005             sonic corp      sonic corp
 3:             <NA>        2005   cascade bancorp inc.            <NA>
 4:              JCP        2005  jc penney company inc penney (j c) co

, который хорошо работает, но имеет столбец NA в столбце Filled_Ticker2LP (который исходит от data набор данных.

Я хотел бы попытаться объединить данные, используя текущий метод, который у меня есть, но если в столбце Filled_Ticker2LP есть значение NA, я бы хотел изменить «совпадающая ссылка» от присоединения к tic и Filled_Ticker2LP к сопоставлению по названию компании. conm или CO_1_Name.

То есть данные в настоящее время не могут присоединиться, поскольку в данных data установите под столбцом Filled_Ticker2LP для наблюдения 3, оно имеет значение NA. Однако это наблюдение все еще может быть объединено с данными comp, так как в c olumn data$CO_1_Name наблюдения 3 имеет cascade Bancorp. Этот результат также появляется в comp данных наблюдений 30 - 53 под столбцом conm.

Я думал о if утверждении, что:

если нет NA в данных $ Filled_Ticker2LP затем соединяется с использованием Filled_Ticker2LP и ti c, а затем соединяется с использованием CO_1_Name и conm.

Дополнительно

Я также заметил, что в столбцах есть некоторые пробелы.

data %>% 
  mutate(
    CO_1_Name = str_trim(CO_1_Name)
  )

Данные 1:

comp <- structure(list(tic = c("JCP", "JCP", "JCP", "JCP", "JCP", "JCP", 
"JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", 
"SONC", "SONC", "SONC", "SONC", "SONC", "SONC", "SONC", "SONC", 
"SONC", "SONC", "SONC", "SONC", "SONC", "SONC", "CACB", "CACB", 
"CACB", "CACB", "CACB", "CACB", "CACB", "CACB", "CACB", "CACB", 
"CACB", "CACB", "CACB", "CACB", "CACB", "CACB", "CACB", "CACB", 
"CACB", "CACB", "CACB", "CACB", "CACB", "CACB"), fyear = c(2004L, 
2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 
2014L, 2015L, 2016L, 2017L, 2018L, 2005L, 2006L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 2017L, 
2018L, 2005L, 2005L, 2006L, 2006L, 2007L, 2007L, 2008L, 2008L, 
2009L, 2009L, 2010L, 2010L, 2011L, 2011L, 2012L, 2012L, 2013L, 
2013L, 2014L, 2014L, 2015L, 2015L, 2016L, 2016L), conm = c("penney (j c) co", 
"penney (j c) co", "penney (j c) co", "penney (j c) co", "penney (j c) co", 
"penney (j c) co", "penney (j c) co", "penney (j c) co", "penney (j c) co", 
"penney (j c) co", "penney (j c) co", "penney (j c) co", "penney (j c) co", 
"penney (j c) co", "penney (j c) co", "sonic corp", "sonic corp", 
"sonic corp", "sonic corp", "sonic corp", "sonic corp", "sonic corp", 
"sonic corp", "sonic corp", "sonic corp", "sonic corp", "sonic corp", 
"sonic corp", "sonic corp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp", "cascade bancorp", "cascade bancorp", 
"cascade bancorp", "cascade bancorp")), row.names = c(NA, -53L
), class = c("tbl_df", "tbl", "data.frame"))

Данные 2:

data <- structure(list(Filled_Ticker2LP = c("SONC", "SONC", NA, "JCP", 
"JCP", "JCP", "SONC", "SONC", "JCP", "JCP", "JCP", "JCP", "SONC", 
"JCP", "JCP", "JCP", "SONC", "JCP", "JCP", "SONC", "JCP", "JCP", 
"JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", "JCP", 
"JCP", "JCP", "JCP", "JCP", "SONC"), publishYear = c(2005L, 2005L, 
2005L, 2005L, 2005L, 2006L, 2006L, 2006L, 2006L, 2006L, 2006L, 
2006L, 2007L, 2007L, 2007L, 2007L, 2007L, 2008L, 2008L, 2008L, 
2009L, 2009L, 2010L, 2010L, 2010L, 2010L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2012L, 2013L, 2015L, 2015L, 2016L), CO_1_Name = c(" sonic corp", 
" sonic corp", " cascade bancorp inc.", " jc penney company inc", 
" jc penney company inc", " jc penney company inc", " sonic corp", 
" sonic corp", " jc penney company inc", " jc penney company inc", 
" jc penney company inc", " jc penney company inc", " sonic corp", 
" jc penney company inc", " jc penney company inc", " jc penney company inc", 
" sonic corp", " jc penney company inc", " jc penney company inc", 
" sonic corp", " jc penney company inc", " jc penney company inc", 
" jc penney company inc", " macy's incorporated", " macy's incorporated", 
" jc penney company inc", " macy's incorporated", " macy's incorporated", 
" jc penney company inc", " apple inc", " apple inc", " macy's incorporated", 
" jc penney company inc", " jc penney company inc", " jc penney company inc", 
" sonic corp")), .internal.selfref = <pointer: 0x55603dbefe00>, row.names = c(NA, 
-36L), class = c("data.table", "data.frame"))

1 Ответ

2 голосов
/ 29 апреля 2020

Если нам нужно объединить по условию, один из вариантов - split на основе вхождения NA в «данных» для этого указанного c столбца, а затем используйте map2, чтобы выполнить объединение

library(dplyr)
library(purrr)
library(stringr)
data %>% 
   mutate(
     CO_1_Name = str_trim(CO_1_Name)
  ) %>% 
   group_split(grp = is.na(Filled_Ticker2LP), keep = FALSE) %>% 
   map2_dfr(list(setNames('tic', "Filled_Ticker2LP"), 
             setNames( "conm", "CO_1_Name")), ~
    left_join(.x, comp, by = c(.y, "publishYear" = "fyear")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...