sprawdzanie duplikatów danych e-mail
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
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:
strsplit(df$email, "@")
pobiera kolumnę e-mail z ramki danych i oddziela każdy ciąg znakiem „@”.first_parts = character()
tworzy pusty wektor znakowyfor (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ć.duplicated(first_parts)
zwraca wektor boolowski z wartością true dla każdej wartości napotkanej po raz drugi.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.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.