vérification des doublons dans les données des e-mails

Nov 26 2020

J'ai de nombreux enregistrements de données pour les e-mails, je veux maintenant vérifier si j'ai des noms en double avec le même identifiant de messagerie et vérifier si des noms en double existent avant @ dans l'e-mail. J'essaye l'approche ci-dessous mais ne fonctionne pas pour moi. aussi j'ai NA et des cellules vides, je veux aussi les ignorer.

Je veux d'abord vérifier s'il existe un autre ID de messagerie avec le même nom. deuxièmement, je veux vérifier s'il existe des noms en double dans la colonne mail (par exemple, nom dans [email protected] si nous avons un autre identifiant de messagerie avec la marque kling)

df <- data.frame(EMP.ID = c(88111,"BBB4477","BBB4058","BBB5832","BBB0338","BBB1814","BBB6543",875430,875970,"BBB0243","BBB1943","BBB9344","BBB9701","BBB1814","BBB8648","BBB4373","BBB7270","BBB6165","BBB7460","BBB7528","BBB6092"),
                 name = c("link adam","dy tt","link adam","gbesada","dojeda","slew lang"," alpucheta","r zona","jachaval","allo nyyn","mbautis","grand fring","jali","kintom dang","namoti","shan mig","NA","NA","NA","NA",""),
                 email = c("[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"," [email protected]"," [email protected]"," [email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"," [email protected]","","NA",""))

Email= "email"
Name = "name"
valuesToIgnore <- c("", NA)

df <- df %>% mutate(`duplicate mailid` = ifelse(
  duplicated(stringr::str_extract(Email, "([^@]+)")) & 
    !is.na(Email) & 
    nchar(as.character(Email)) > 0, 
  "Duplicate mail exist", ""
))

indicesOfAtSymbol <- unlist(gregexpr(pattern='@',Email))
namesFromEmails <- substr(Email,1, indicesOfAtSymbol-1)
df <- df %>%  mutate(`duplicate name`= ifelse(duplicated(namesFromEmails, incomparables=valuesToIgnore),"duplicate name",""))

la sortie devrait être comme

Réponses

Shamis Nov 26 2020 at 17:54

Tidyverse est un marteau donc tout ressemble à un clou. Les marteaux sont dangereux.

df <- data.frame(EMP.ID = c(88111,"BBB4477","BBB4058","BBB5832","BBB0338","BBB1814","BBB6543",875430,875970,"BBB0243","BBB1943","BBB9344","BBB9701","BBB1814","BBB8648","BBB4373","BBB7270","BBB6165","BBB7460","BBB7528","BBB6092"),
                 name = c("link adam","dy tt","link adam","gbesada","dojeda","slew lang"," alpucheta","r zona","jachaval","allo nyyn","mbautis","grand fring","jali","kintom dang","namoti","shan mig","NA","NA","NA","NA",""),
                 email = c("[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"," [email protected]"," [email protected]"," [email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]","[email protected]"," [email protected]","","NA",""))

parts = strsplit(df$email, "@")
first_parts = character()
for (i in 1:length(parts)) {
  first_parts[i] <- parts[[i]][1]
}
print(parts[which(duplicated(first_parts))])

Solution pure R. Si vous avez besoin d'autre chose, utilisez simplement les index du which(duplicated(first_parts))pour récupérer les données. Pas besoin d'invoquer les horreurs de Tidyverse.

Explication supplémentaire, comme demandé dans le commentaire:

  1. strsplit(df$email, "@") prend la colonne e-mail de votre bloc de données et sépare chaque chaîne par le signe «@».
  2. first_parts = character() crée un vecteur de caractère vide
  3. for (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] } puisque le strsplit aboutit à une liste un peu maladroite, nous ne prenons ici que la première moitié des e-mails, puisque c'est ce que nous voulons comparer.
  4. duplicated(first_parts) renvoie un vecteur booléen avec true pour chaque valeur rencontrée pour la deuxième fois.
  5. which(...)renvoie les indices des TRUE. Une étape qui est plus une amélioration cosmétique puisque la lecture des nombres est généralement plus facile que la recherche de quelques TRUEs dans un long vecteur de FALSEs.
  6. parts[...]ne prenez que les entrées de la liste avec les indices de l'étape précédente. Notez également que dans le cas où le préfixe de l'e-mail apparaît 3 fois ou plus, il sera répertorié ici N - 1 fois, car le dupliqué renvoie VRAI pour chaque occurrence au-delà de la première.

Et sérieusement. Si vous avez besoin de lire cette explication, éloignez-vous de tidyverse jusqu'à ce que vous ayez appris les bases. Tidyverse est un outil vraiment puissant. Cela je l'admets. Cependant, cela apporte un chaos supplémentaire au R déjà chaotique, donc à moins que vous n'ayez une solide maîtrise de R, veuillez reconsidérer.