verificar duplicatas em dados de e-mail
Tenho muitos registros de dados para email, agora quero verificar se tenho nomes duplicados com o mesmo id de email e verificar se existem nomes duplicados antes de @ no email. Estou tentando a abordagem abaixo, mas não está funcionando para mim. também tenho NA e células em branco, também quero ignorá-los.
primeiro, quero verificar se existe outro ID de e-mail com o mesmo nome. em segundo lugar, quero verificar se existem nomes duplicados na coluna de e-mail (por exemplo, nome em [email protected] se tivermos outro id de e-mail com a marca 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",""))
a saída deve ser como

Respostas
O Tidyverse é um martelo, então tudo parece um prego. Martelos são perigosos.
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))])
Solução R pura. Se precisar de mais alguma coisa, basta usar os índices do which(duplicated(first_parts))
para recuperar os dados. Não há necessidade de convocar os horrores do Tidyverse.
Explicação adicional, conforme solicitado no comentário:
strsplit(df$email, "@")
pega a coluna de e-mail de seu quadro de dados e separa cada string pelo sinal "@".first_parts = character()
cria um vetor de personagem vaziofor (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] }
como o strsplit resulta em uma lista um pouco desajeitada, aqui pegamos apenas a primeira metade dos e-mails, pois é isso que queremos comparar.duplicated(first_parts)
retorna um vetor booleano com true para cada valor encontrado pela segunda vez.which(...)
retorna índices de TRUEs. Uma etapa que é mais uma melhoria cosmética, uma vez que ler números geralmente é mais fácil do que procurar alguns TRUEs em um vetor longo de FALSEs.parts[...]
pegue apenas as entradas da lista com os índices da etapa anterior. Observe também que caso o prefixo do e-mail ocorra 3 ou mais vezes, ele será listado aqui N - 1 vezes, uma vez que o duplicado retorna TRUE para cada ocorrência além da primeira.
E sério. Se você precisar ler esta explicação, fique longe do tidyverse até aprender o básico. O Tidyverse é uma ferramenta realmente poderosa. Isso eu admito. No entanto, isso traz mais caos ao já caótico R, então, a menos que você tenha um domínio sólido sobre R, reconsidere.