verificar duplicatas em dados de e-mail

Nov 26 2020

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

Shamis Nov 26 2020 at 17:54

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:

  1. strsplit(df$email, "@") pega a coluna de e-mail de seu quadro de dados e separa cada string pelo sinal "@".
  2. first_parts = character() cria um vetor de personagem vazio
  3. for (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.
  4. duplicated(first_parts) retorna um vetor booleano com true para cada valor encontrado pela segunda vez.
  5. 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.
  6. 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.