Частичное совпадение строк между двумя столбцами в R - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь проверить правильность адресов электронной почты для списка. Я думал, что смогу сделать частичное совпадение строк между столбцами Email и Name и вернуть логический вектор (TRUE / FALSE) в новом столбце.

В приведенном ниже примере только строки 3 и 5 имеют правильные электронные письма, и для этих строк вывод будет «ИСТИНА». Я попробовал следующее, и это не сработало:

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

>Test$Email %in% Test$LastName

Любые другие предложения тоже приветствуются. Спасибо!

enter image description here

Ответы [ 3 ]

2 голосов
/ 26 марта 2020

Базовым вариантом 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

DATA

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"))

1 голос
/ 26 марта 2020

Попробуйте:

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 
1 голос
/ 26 марта 2020

Попробуйте что-нибудь подобное? Вы почти у цели, просто нужно хранить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...