Zatrudniam Rstudio. Mam następujący model zabawka:

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)

Chcę stworzyć trzecią kolumnę o nazwie df$matched, w którym każdy wpis z Name1 wyszukuje przez całą kolumnę Name2 i wytwarza wyjście 1, jeśli ciąg jest obecny częściowo w {{x3} } i 0, jeśli nie jest obecny.

Moje obecne podejście do korzystania z gamionów Mutate produkuje mecz 1: 1.

Moje pożądane wyjście byłoby nową kolumną z: 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

r
0
JodeCharger100 2 marzec 2019, 00:04

2 odpowiedzi

Najlepsza odpowiedź

Zgodnie z twoim komentarzem, zakładam, że chcesz liczyć dowolny kompletny ciąg z Name1 zawarty w Name2. Następnie możesz użyć pmatch() dla dopasowywania częściowego ciągu i konwersji wyniku do logicznego przy użyciu as.logical(). Jeśli chcesz 0 s i 1 s zamiast FALSE i TRUE, dodaj kolejny jak.Numeric ():

df$matched <- as.numeric(as.logical(pmatch(df$Name1, df$Name2, nomatch = 0, duplicates.ok = TRUE)))
3
fujiu 1 marzec 2019, 21:29

Rozwiązanie przy użyciu stringr::str_detect. Daje inną odpowiedź na "BMO" niż rozwiązanie 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

Różnica dla BMO jest to, że pojawia się w "Bank of Montreal BMO" - nie na początku pełnego ciągu nazw. We wszystkich innych przypadkach mecz występuje na początku.

2
dipetkov 2 marzec 2019, 07:25