【问题标题】:Partial string matching between two columns in RR中两列之间的部分字符串匹配
【发布时间】:2020-03-25 20:45:05
【问题描述】:

我正在尝试验证列表的电子邮件是否正确。我在想我可以在电子邮件和名称列之间进行部分字符串匹配,并在新列中返回一个逻辑向量 (TRUE/FALSE)。

在下面的示例中,只有第 3 行和第 5 行有正确的电子邮件,并且这些行的输出将为“TRUE”。我尝试了以下方法,但没有成功:

>for (i in Test$LastName) {
 Test$Match <- agrepl(i, Test$Email, ignore.case = TRUE)
}

>Test$Email %in% Test$LastName

也欢迎任何其他建议。谢谢!

【问题讨论】:

  • 我认为grepl 功能可能会有所帮助
  • 有一些不错的答案,但我只想补充一点,您的代码没有给您预期结果的原因是,当您将 Test$Email 传递给 agrepl 函数时,您传递数据框中的所有电子邮件地址。
  • 你是最棒的,瑞恩!是的,答案让我意识到这一点。非常感谢您帮助我更好地理解它。

标签: r string-matching


【解决方案1】:

基本 R 选项是使用 grepl + mapply

Test <- within(Test, Match <- mapply(grepl,paste(FirstNmae,LastName,sep = "|"),Email,ignore.case = TRUE))

这样

> Test
  FirstNmae LastName                    Email Match
1    Audrey      Low         T.Rose@gmail.com FALSE
2     Tammy     Rose          A.Low@gmail.com FALSE
3    Stacey     Lock     stacy.lock@gmail.com  TRUE
4    Judson   Porter beth.mccormick@gmail.com FALSE
5    Kellie     Sims         k.sims@gmail.com  TRUE

数据

Test <- data.frame(FirstNmae = c("Audrey","Tammy","Stacey","Judson","Kellie"),
                 LastName = c("Low","Rose","Lock","Porter","Sims"),
                 Email = c("T.Rose@gmail.com","A.Low@gmail.com","stacy.lock@gmail.com","beth.mccormick@gmail.com","k.sims@gmail.com"))

【讨论】:

    【解决方案2】:

    试试这样的?您快到了,只需将 TRUE/FALSE 存储在向量中。我使用 sapply,遍历行名并比较相应的列。在 sapply 中,结果存储在向量中,因此您可以将其用作 TRUE/FALSE:

    test = data.frame(FirstName=c("Audrey","Tammy","Stacey","Judson","Kellie"),
    LastName=c("Low","Rose","Lock","Porter","Sims"),
    Email=c("T.Rose@gmail.com","A.Low@gmail.com","stacy.lock@gmail.com","beth.mccormick@gmail.com","k.sims@gmail.com"))
    
    matches = sapply(1:nrow(test),function(i)agrepl(test$LastName[i],test$Email[i]))
    
    test[matches,]
    
      FirstName LastName                Email
    3    Stacey     Lock stacy.lock@gmail.com
    5    Kellie     Sims     k.sims@gmail.com
    

    【讨论】:

    • 感谢您帮助我理解这一点!这提醒我,我需要使用 [i] 将每个输出存储在自己的家中:)
    【解决方案3】:

    试试这个:

    DF <- data.frame(FirstName = c("Audrey","Tammy","Stacey","Judson","Kellie"),
                     LastName = c("Low","Rose","Lock","Porter","Sims"),
                     Email = c("T.Rose@gmail.com","A.Low@gmail.com","stacy.lock@gmail.com","beth.mccormick@gmail.com","k.sims@gmail.com"))
    
    library(dplyr)
    
    DF %>% 
      rowwise() %>%
      mutate(isMatch = grepl(LastName, Email, ignore.case = T))
    
    

    输出:

      FirstName LastName Email                    isMatch    
      <fct>     <fct>    <fct>                    <lgl>
    1 Audrey    Low      T.Rose@gmail.com         FALSE
    2 Tammy     Rose     A.Low@gmail.com          FALSE
    3 Stacey    Lock     stacy.lock@gmail.com     TRUE 
    4 Judson    Porter   beth.mccormick@gmail.com FALSE
    5 Kellie    Sims     k.sims@gmail.com         TRUE 
    

    【讨论】:

    • 喜欢简单的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多