可以将grepl与行值一起使用吗?

时间:2020-08-03 18:26:40

标签: r regex grepl

我正在尝试查看用户名数据框是否包含另一个数据框的全名。

我正在遍历每个用户名,并使用 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 :(得分:0)

您可以执行以下操作:

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

reprex package(v0.3.0)于2020-08-03创建