Как сопоставить список символов с частичными строками в R? - PullRequest
0 голосов
/ 15 января 2020

Я анализирую идентификаторы из базы данных RePE c. Каждый идентификатор соответствует уникальной публикации, и иногда публикации связаны между собой, потому что они являются разными версиями друг друга (например, рабочий документ, который становится журнальной статьей). У меня есть база данных около 250 000 записей, которая показывает основные идентификаторы в одном столбце, а затем предыдущие или альтернативные идентификаторы в другом. Это выглядит так:

df$repec_id <– c("RePEc:cid:wgha:353", "RePEc:hgd:wpfacu:350","RePEc:cpi:dynxce:050")
df$alt_repec_id <– c("RePEc:sii:giihdizi:heidwg06-2019|RePEc:azi:cusiihdizi:gdhs06-2019", "RePEc:tqu:vishdizi:d8z7-200x", "RePEc:aus:cecips:15_59|RePEc:sga:leciam:c8wc0z888s|RePEc:cpi:dynxce:050", "RePEc:cid:wgha:353|RePEc:hgd:wpfacu:350")

Я хочу выяснить, какие идентификаторы из столбца repec_id также присутствуют в столбце alt_repec_id, и создать фрейм данных, в котором есть только строки, соответствующие этому условию. Я попытался strsplit на "|" и используйте функцию %in% следующим образом:

df <- separate_rows(df, alt_repec_id, sep = "\\|") 
df1 <- df1[trimws(df$alt_repec_id) %in% trimws(df$repec_id), ]
df1<- data.frame(df1)
df1 <- na.omit(df1)
df1 <- df1[!duplicated(df1$repec_id),]

Это работает, но я беспокоюсь, что, удаляя дублирующиеся строки на основе значений в столбце repec_id, я случайно удаляю совпадения. Это правильно?

В конечном итоге я хочу, чтобы кадр данных содержал только те значения, в которых строки в столбце repec_id соответствуют частичным строкам в столбце alt_repec_id. Используя приведенный выше пример, я хочу получить следующий результат:

df$repec_id <– c("RePEc:cpi:dynxce:050")
df$alt_repec_id <– c("RePEc:aus:cecips:15_59|RePEc:sga:leciam:c8wc0z888s|RePEc:cpi:dynxce:050")

У кого-нибудь есть решение моей проблемы? Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 16 января 2020

Вот базовое решение R с использованием grepl() + apply() + subset()

dfout <- subset(df,apply(df, 1, function(v) grepl(v[1],v[2])))

таким, что

> dfout
              repec_id                                                            alt_repec_id
3 RePEc:cpi:dynxce:050 RePEc:aus:cecips:15_59|RePEc:sga:leciam:c8wc0z888s|RePEc:cpi:dynxce:050

DATA

df <- structure(list(repec_id = structure(c(1L, 3L, 2L), .Label = c("RePEc:cid:wgha:353", 
"RePEc:cpi:dynxce:050", "RePEc:hgd:wpfacu:350"), class = "factor"), 
    alt_repec_id = structure(c(2L, 3L, 1L), .Label = c("RePEc:aus:cecips:15_59|RePEc:sga:leciam:c8wc0z888s|RePEc:cpi:dynxce:050", 
    "RePEc:sii:giihdizi:heidwg06-2019|RePEc:azi:cusiihdizi:gdhs06-2019", 
    "RePEc:tqu:vishdizi:d8z7-200x"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))
1 голос
/ 16 января 2020

Попробуйте использовать str_detect() из stringr, чтобы определить, существует ли repec_id в большей строке alt_repec_id.

Затем filter() до того места, где оно было найдено. Это не возвращает, как ожидалось, попробуйте посмотреть и опубликовать несколько примеров, где found_match == FALSE, но ожидалось совпадение.

library(stringr)
library(dplyr)

df %>%
  mutate(found_match = str_detect(alt_repec_id, repec_id)) %>% 
  filter(found_match == TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...