Как сопоставить идентификаторы с именами в другом фрейме данных в R - PullRequest
1 голос
/ 08 февраля 2020

У меня есть два кадра данных с идентификаторами из базы данных RePE c.

В одном кадре данных у меня есть около 3000 идентификаторов и список числовых значений. Это выглядит так:

df1$repec_id <- c("RePEc:eee:ecolet:v:173:y:2018:i:c:p:65-68", "RePEc:eee:moneco:v:103:y:2019:i:c:p:105-122", "RePEc:ess:wpaper:id:6872")
df1$numbers <- c("1.4", "3.5", "4.9)

Затем у меня есть еще один кадр данных со многими другими идентификаторами (около 150 000), включая идентификаторы из df1 и имена авторов. Выглядит это так:

df2$repec_id <- c("RePEc:eee:ecolet:v:173:y:2018:i:c:p:65-68", "RePEc:eee:moneco:v:103:y:2019:i:c:p:105-122", "RePEc:ess:wpaper:id:6872", "RePEc:sgc:wpaper:id:2926")
df2$authors <- c("Smith, John; Hope, Gill", "Robinson, Jill", "Chu, James", "Ravendran, Vikram")
df2$year <- c("2019", "2020", "2018", "2017)

Я хочу перетащить фамилии авторов и год публикации, связанные с каждым идентификатором, в df1 и создать новый столбец new_IDs, который будет таким, чтобы конечный результат выглядел следующим образом это:

df1$repec_id <- c("RePEc:eee:ecolet:v:173:y:2018:i:c:p:65-68", "RePEc:eee:moneco:v:103:y:2019:i:c:p:105-122", "RePEc:ess:wpaper:id:6872")
df1$numbers <- c("1.4", "3.5", "4.9)
df1$new_id <- c("Smith and Hope 2019", "Robinson 2020", "Chu 2018")

Кто-нибудь знает, как я могу это сделать? Заранее благодарю за помощь!

1 Ответ

1 голос
/ 08 февраля 2020

Мы можем сделать left_join, а затем извлечь слова перед , и вставить с 'year'

library(dplyr)
library(purrr)
library(stringr)
df1 %>%
  left_join(df2) %>% 
  mutate(new_id = str_c(map(str_extract_all(authors, "\\w+(?=,)"), 
          str_c, collapse = ' and '), year, sep=" ")) %>%
  select(-authors, -year)
#                                     repec_id numbers              new_id
#1   RePEc:eee:ecolet:v:173:y:2018:i:c:p:65-68     1.4 Smith and Hope 2019
#2 RePEc:eee:moneco:v:103:y:2019:i:c:p:105-122     3.5       Robinson 2020
#3                    RePEc:ess:wpaper:id:6872     4.9            Chu 2018

Или вместо извлечения, мы можем удалить с помощью str_remove

df1 %>% 
    left_join(df2) %>%
    transmute(repec_id, numbers, 
       new_id = str_c(str_remove_all(authors, ',\\s*\\w+(?:;|$)'), year, sep=' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...