Подберите два столбца, выполнив поиск по столбцу;оба столбца в одном кадре данных - PullRequest
0 голосов
/ 02 марта 2019

Я использую RStudio.У меня есть следующая модель игрушки:

df <- data.frame("Name1" = c("JPMorgan", "BMO", "Citibank", "Barclays", "Deutsche", "Chase", "HSBC", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".","."), "Name2" = c("JPMorgan and Chase","SEFCU Union","Wells Fargo Commercial Bank","Bank of America", "Citibank LLC","Charles Schwab", "Barclays", "HSBC Holdings PLc",  "Wall Bank Holdings", "Chase Manhattan Bank", "TD Bank", "Ally Bank", "Goldman Sachs", "M&T Bank", "Key Bank", "Royal Bank of Canada", "Bank of Montreal BMO", "US Bancorp", "Capital One", "BNY Mellon"), stringsAsFactors = FALSE)

Я хочу создать третий столбец с именем df$matched, в котором каждая запись из Name1 просматривает весь столбец Name2 и выдает 1, еслистрока присутствует частично в Name2 и 0, если ее нет.

Мой нынешний подход использования строкового преобразования состоит в совпадении 1: 1.

Мой желаемый результат - новый столбец с: 1 1 1 1 0 1 1 0 0 0 0 0 00 0 0 0 0 0 0 0

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Решение с использованием stringr::str_detect.Он дает иной ответ для «BMO», чем решение pmatch.

library("dplyr")
library("stringr")

has_match <- function(name, candidates) {
  if (name == ".")
    FALSE
  else
    any(str_detect(candidates, name))
}

df <- df %>% # Add the new columns. Although first you should probably decide on
             # which partial matching algorithm you want to use.
  mutate(match = sapply(Name1, has_match, Name2)) %>%
  mutate(match2 = pmatch(Name1, Name2, nomatch = 0, duplicates.ok = TRUE) > 0)
df
#       Name1                       Name2 match match2
# 1  JPMorgan          JPMorgan and Chase  TRUE   TRUE
# 2       BMO                 SEFCU Union  TRUE  FALSE
# 3  Citibank Wells Fargo Commercial Bank  TRUE   TRUE
# 4  Barclays             Bank of America  TRUE   TRUE
# 5  Deutsche                Citibank LLC FALSE  FALSE
# 6     Chase              Charles Schwab  TRUE   TRUE
# 7      HSBC                    Barclays  TRUE   TRUE

Разница для BMO заключается в том, что он появляется в «Bank of Montreal BMO», а не в начале полного именистрока.Во всех остальных случаях совпадение происходит в начале.

0 голосов
/ 02 марта 2019

Согласно вашему комментарию, я предполагаю, что вы хотите посчитать любую полную строку из Name1, содержащуюся в Name2.Затем вы можете использовать pmatch() для частичного совпадения строк и преобразовать результат в логический, используя as.logical().Если вы хотите 0 с и 1 с вместо FALSE и TRUE, просто добавьте еще один as.numeric ():

df$matched <- as.numeric(as.logical(pmatch(df$Name1, df$Name2, nomatch = 0, duplicates.ok = TRUE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...