comprobar duplicados en datos de correo electrónico
Tengo muchos registros de datos para el correo electrónico, ahora quiero verificar si tengo nombres duplicados con la misma identificación de correo y verificar si existen nombres duplicados antes de @ en el correo electrónico. Estoy intentando el siguiente enfoque pero no funciona para mí. también tengo NA y celdas en blanco, también quiero ignorarlas.
primero quiero comprobar si existe otra ID de correo con el mismo nombre. en segundo lugar, quiero verificar si existen nombres duplicados en la columna de correo (por ejemplo, el nombre en [email protected] si tenemos otra identificación de correo con la 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",""))
la salida debería ser como

Respuestas
Tidyverse es un martillo, por lo que todo parece un clavo. Los martillos son peligrosos.
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))])
Solución R pura. Si necesita algo más, simplemente use los índices del which(duplicated(first_parts))
para recuperar los datos. No es necesario convocar a los horrores de Tidyverse.
Explicación adicional, como se solicita en el comentario:
strsplit(df$email, "@")
toma la columna de correo electrónico de su marco de datos y separa cada cadena con el signo "@".first_parts = character()
crea un vector de caracteres vacíofor (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] }
dado que strsplit da como resultado una lista que es un poco torpe, aquí tomamos solo la primera mitad de los correos electrónicos, ya que eso es lo que queremos comparar.duplicated(first_parts)
devuelve un vector booleano con verdadero para cada valor que se encuentra por segunda vez.which(...)
devuelve índices de los VERDADEROS. Un paso que es más una mejora cosmética, ya que leer números suele ser más fácil que buscar pocos VERDADEROS en un vector largo de FALSOS.parts[...]
tome solo las entradas de la lista con los índices del paso anterior. También tenga en cuenta que en caso de que el prefijo de correo electrónico aparezca 3 o más veces, aparecerá aquí N - 1 veces, ya que el duplicado devuelve VERDADERO para cada aparición más allá de la primera.
Y en serio. Si necesita leer esta explicación, manténgase alejado de tidyverse hasta que aprenda los conceptos básicos. Tidyverse es una herramienta realmente poderosa. Eso lo admito. Sin embargo, trae más caos a la ya caótica R, por lo que, a menos que tenga un conocimiento sólido de R, reconsidere.