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!
3 Réponses :
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
Merci de m'avoir aidé à comprendre cela! Cela m'a rappelé que je devais stocker chaque sortie dans sa propre maison en utilisant [i] :)
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"))
J'adore la solution simple. Merci!
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
Je pense que le
grepl code > La fonction
pourrait être utileIl 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 fonctionconsentpl
, 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.