Überprüfen von Duplikaten in E-Mail-Daten

Nov 26 2020

Ich habe viele Datensätze für E-Mails. Jetzt möchte ich überprüfen, ob ich doppelte Namen mit derselben E-Mail-ID habe und ob vor @ in E-Mails doppelte Namen vorhanden sind. Ich versuche unten Ansatz, aber nicht für mich arbeiten. Ich habe auch NA und leere Zellen, die ich auch ignorieren möchte.

Zuerst möchte ich überprüfen, ob eine andere Mail-ID mit demselben Namen vorhanden ist. Zweitens möchte ich überprüfen, ob in der Mail-Spalte doppelte Namen vorhanden sind (zum Beispiel Name in [email protected], wenn wir eine andere Mail-ID mit kling-Zeichen haben).

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

Die Ausgabe sollte wie sein

Antworten

Shamis Nov 26 2020 at 17:54

Tidyverse ist ein Hammer, also sieht alles aus wie ein Nagel. Hämmer sind gefährlich.

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

Reine R-Lösung. Wenn Sie etwas anderes benötigen, verwenden Sie einfach die Indizes von which(duplicated(first_parts)), um die Daten abzurufen. Keine Notwendigkeit, die Tidyverse-Schrecken zu beschwören.

Weitere Erklärung, wie im Kommentar angefordert:

  1. strsplit(df$email, "@") Nimmt die E-Mail-Spalte aus Ihrem Datenrahmen und trennt jede Zeichenfolge durch das "@".
  2. first_parts = character() erstellt einen leeren Zeichenvektor
  3. for (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] } Da das strsplit zu einer etwas klobigen Liste führt, nehmen wir hier nur die erste Hälfte der E-Mails, da wir diese vergleichen möchten.
  4. duplicated(first_parts) Gibt für jeden Wert, der zum zweiten Mal auftritt, einen booleschen Vektor mit true zurück.
  5. which(...)Gibt Indizes der TRUEs zurück. Ein Schritt, der eher eine kosmetische Verbesserung darstellt, da das Lesen von Zahlen normalerweise einfacher ist als die Suche nach wenigen WAHREN in einem langen Vektor von FALSCHEN.
  6. parts[...]Nehmen Sie nur die Listeneinträge mit den Indizes aus dem vorherigen Schritt. Beachten Sie auch, dass das E-Mail-Präfix für den Fall, dass es dreimal oder öfter vorkommt, hier N-1-mal aufgeführt wird, da das Duplikat für jedes nachstehende Ereignis TRUE zurückgibt.

Und im Ernst. Wenn Sie diese Erklärung lesen müssen, halten Sie sich von Tidyverse fern, bis Sie die Grundlagen gelernt haben. Tidyverse ist ein wirklich mächtiges Werkzeug. Das gebe ich zu. Es bringt jedoch weiteres Chaos in das bereits chaotische R, also überdenken Sie es bitte noch einmal, es sei denn, Sie haben ein solides Verständnis für R.