1
votes

Correspondance de chaîne partielle entre deux colonnes dans R

J'essaie de vérifier que les e-mails d'une liste sont corrects. Je pensais que je pourrais faire une correspondance de chaîne partielle entre les colonnes Email et Name, et renvoyer un vecteur logique (TRUE / FALSE) dans une nouvelle colonne.

Dans l'exemple ci-dessous, seules les lignes 3 et 5 ont des e-mails corrects, et le résultat serait "TRUE" pour ces lignes. J'ai essayé ce qui suit, et cela n'a pas fonctionné:

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

>Test$Email %in% Test$LastName

Toutes les autres suggestions sont également les bienvenues. Merci!

 entrez la description de l'image ici


3 commentaires

Je pense que le grepl La fonction pourrait être utile


Il y a quelques bonnes réponses mais j'ajouterai juste que la raison pour laquelle votre code ne vous donne pas les résultats attendus est que lorsque vous passez Test $ Email à la fonction consentpl , vous transmettez TOUTES les adresses e-mail de votre bloc de données.


Tu es le meilleur, Ryan! Oui, les réponses m'ont fait réaliser cela. Merci beaucoup de m'avoir aidé à mieux le comprendre.


3 Réponses :


1
votes

Essayez quelque chose comme ça? Vous y êtes presque, il suffit de stocker le TRUE / FALSE dans un vecteur. J'ai utilisé sapply, parcourir les noms de domaine et comparer les colonnes correspondantes. Dans sapply, les résultats sont stockés dans un vecteur afin que vous puissiez l'utiliser comme 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


1 commentaires

Merci de m'avoir aidé à comprendre cela! Cela m'a rappelé que je devais stocker chaque sortie dans sa propre maison en utilisant [i] :)



1
votes

Essayez ceci:

  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 
library(dplyr)

DF %>% 
  rowwise() %>%
  mutate(isMatch = grepl(LastName, Email, ignore.case = T))

Résultat:

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


1 commentaires

J'adore la solution simple. Merci!



2
votes

Une option de base R consiste à utiliser grepl + mapply

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

tel que

> 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


0 commentaires