memeriksa duplikat dalam data email

Nov 26 2020

Saya memiliki banyak catatan data untuk email, sekarang saya ingin memeriksa apakah saya memiliki nama duplikat dengan id email yang sama dan memeriksa apakah ada nama duplikat sebelum @ di email. saya mencoba di bawah pendekatan tetapi tidak bekerja untuk saya. juga saya memiliki NA dan sel kosong saya juga ingin mengabaikannya.

pertama saya ingin memeriksa apakah ada ID email lain dengan nama yang sama. kedua saya ingin memeriksa apakah ada nama duplikat yang ada di kolom surat (misalnya nama di [email protected] jika kita memiliki id surat lain dengan tanda 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",""))

outputnya harus seperti

Jawaban

Shamis Nov 26 2020 at 17:54

Tidyverse adalah palu sehingga semuanya terlihat seperti paku. Palu berbahaya.

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

Solusi R murni. Jika Anda membutuhkan yang lain, cukup gunakan indeks dari which(duplicated(first_parts))untuk mengambil data. Tidak perlu memanggil kengerian Tidyverse.

Penjelasan lebih lanjut, seperti yang diminta dalam komentar:

  1. strsplit(df$email, "@") mengambil kolom email dari bingkai data Anda dan memisahkan setiap string dengan tanda "@".
  2. first_parts = character() membuat vektor karakter kosong
  3. for (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] } karena strsplit menghasilkan daftar yang agak kikuk, di sini kita hanya mengambil setengah dari email pertama, karena itulah yang ingin kita bandingkan.
  4. duplicated(first_parts) mengembalikan vektor boolean dengan true untuk setiap nilai yang ditemukan untuk kedua kalinya.
  5. which(...)mengembalikan indeks BENAR. Sebuah langkah yang lebih merupakan perbaikan kosmetik karena membaca angka biasanya lebih mudah daripada mencari beberapa TRUE dalam vektor panjang FALSEs.
  6. parts[...]ambil hanya entri daftar dengan indeks dari langkah sebelumnya. Perhatikan juga bahwa jika prefiks email muncul 3 kali atau lebih, itu akan dicantumkan di sini N - 1 kali, karena duplikat mengembalikan TRUE untuk setiap kemunculan setelah yang pertama.

Dan serius. Jika Anda perlu membaca penjelasan ini, jauhi tidyverse sampai Anda mempelajari dasar-dasarnya. Tidyverse adalah alat yang sangat kuat. Itu saya akui. Namun itu membawa kekacauan lebih lanjut ke R yang sudah kacau jadi kecuali Anda memiliki pemahaman yang kuat tentang R, harap pertimbangkan kembali.