sprawdzanie duplikatów danych e-mail

Nov 26 2020

Mam wiele rekordów danych do wiadomości e-mail, teraz chcę sprawdzić, czy mam zduplikowane nazwy z tym samym identyfikatorem poczty i sprawdzić, czy zduplikowane nazwy istnieją przed @ w wiadomości e-mail. próbuję poniżej podejścia, ale nie działa dla mnie. też mam NA i puste komórki, które też chcę zignorować.

najpierw chcę sprawdzić, czy istnieje inny identyfikator poczty o tej samej nazwie. po drugie chcę sprawdzić, czy istnieją zduplikowane nazwy w kolumnie mail (na przykład nazwa w [email protected], jeśli mamy inny identyfikator poczty ze znakiem 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",""))

wyjście powinno być podobne

Odpowiedzi

Shamis Nov 26 2020 at 17:54

Tidyverse to młotek, więc wszystko wygląda jak gwóźdź. Młotki są niebezpieczne.

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

Czysty roztwór R. Jeśli potrzebujesz czegoś innego, po prostu użyj indeksów z, which(duplicated(first_parts))aby pobrać dane. Nie ma potrzeby przyzywać horroru Tidyverse.

Dalsze wyjaśnienia, zgodnie z prośbą w komentarzu:

  1. strsplit(df$email, "@") pobiera kolumnę e-mail z ramki danych i oddziela każdy ciąg znakiem „@”.
  2. first_parts = character() tworzy pusty wektor znakowy
  3. for (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] } ponieważ strsplit daje w wyniku listę, która jest odrobinę niezgrabna, tutaj bierzemy tylko pierwszą połowę wiadomości e-mail, ponieważ to właśnie chcemy porównać.
  4. duplicated(first_parts) zwraca wektor boolowski z wartością true dla każdej wartości napotkanej po raz drugi.
  5. which(...)zwraca indeksy PRAWDA. Krok, który jest bardziej kosmetyczną poprawą, ponieważ odczytywanie liczb jest zwykle łatwiejsze niż wyszukiwanie kilku wartości PRAWDA w długim wektorze wartości FAŁSZ.
  6. parts[...]weź tylko wpisy listy z indeksami z poprzedniego kroku. Należy również pamiętać, że w przypadku, gdy prefiks wiadomości e-mail występuje 3 lub więcej razy, zostanie wyświetlony tutaj N - 1 razy, ponieważ zduplikowane zwracają wartość PRAWDA dla każdego wystąpienia poza pierwszym.

I poważnie. Jeśli chcesz przeczytać to wyjaśnienie, trzymaj się z daleka od tidyverse, dopóki nie nauczysz się podstaw. Tidyverse to naprawdę potężne narzędzie. To przyznaję. Jednak powoduje to dalszy chaos w już chaotycznym R, więc jeśli nie masz solidnego zrozumienia R, zastanów się ponownie.