Можете ли вы использовать grepl со значениями строк? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь увидеть, содержит ли фрейм данных имен пользователей полные имена из другого фрейма данных.

Я перебираю каждое имя пользователя и использую grepl , чтобы увидеть, содержит ли имя пользователя имя и фамилия из другого фрейма данных.

Я пробовал:

    matches <- 0
    for (i in df1$usernames)
    {
      if (grepl(df2$FIRST_NAME, i, fixed=TRUE) & grepl(df2$LAST_NAME, i, fixed=TRUE))
      {
         matches <- matches+1
      }
     }

Можно ли использовать grepl для значений в столбце вместо строки? Потому что это не работает - если нет, то как еще я могу увидеть, находятся ли имя и фамилия строки в имени пользователя.

Например, John123Doe, JohnDoe123, JohnDoe должны все совпадать со строкой, содержащей "John" и "Doe"

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете сделать что-то вроде этого:

df1 <- data.frame(username=c("John123Doe", "JohnDoe123", "JohnDoe", "JonDoe", "YonDo"))
df2 <- data.frame(First=c("Jack","Joe", "Jon", "John", "Jo"), 
                  Last=c("Doe", "Dohe", "Doer", "Doe", "Do"))

findUser <- function(x) {
  res <- apply(df2, 1, function(y) grepl(y["First"], x) & grepl(y["Last"], x))
  ifelse(sum(res) > 0, paste(do.call("paste", df2[res,]), collapse=", "), NA)
}

df1$containsUserName <- sapply(df1$username, findUser)

df1
#>     username containsUserName
#> 1 John123Doe  John Doe, Jo Do
#> 2 JohnDoe123  John Doe, Jo Do
#> 3    JohnDoe  John Doe, Jo Do
#> 4     JonDoe            Jo Do
#> 5      YonDo             <NA>

# or vectorize the function:
FindUser <- Vectorize(findUser)
FindUser(df1$username)
#>        John123Doe        JohnDoe123           JohnDoe            JonDoe 
#> "John Doe, Jo Do" "John Doe, Jo Do" "John Doe, Jo Do"           "Jo Do" 
#>             YonDo 
#>                NA

Создано 2020-08-03 с помощью пакета реплекс (v0.3.0)

...