メールデータの重複をチェックする
Nov 26 2020
電子メールのデータのレコードがたくさんあるので、同じメールIDの名前が重複していないかどうかを確認し、電子メールの@の前に重複した名前が存在するかどうかを確認します。私は以下のアプローチを試みていますが、私のために働いていません。また、NAと空白のセルがあり、それらも無視したいと思います。
まず、同じ名前の別のメールIDが存在するかどうかを確認したいと思います。次に、メール列に重複する名前が存在するかどうかを確認したい(たとえば、klingマークの付いた別のメールIDがある場合は[email protected]の名前)
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",""))
出力は次のようになります

回答
Shamis Nov 26 2020 at 17:54
Tidyverseはハンマーなので、すべてが釘のように見えます。ハンマーは危険です。
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))])
純粋なRソリューション。他のものが必要な場合は、のインデックスwhich(duplicated(first_parts))
を使用してデータを取得してください。Tidyverseホラーを召喚する必要はありません。
コメントで要求された詳細な説明:
strsplit(df$email, "@")
データフレームから電子メール列を取得し、各文字列を「@」記号で区切ります。first_parts = character()
空の文字ベクトルを作成しますfor (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] }
strsplitの結果、リストが少し不格好になるため、ここでは、比較したいのは前半の電子メールのみを取り上げます。duplicated(first_parts)
2回目に遭遇するすべての値に対してtrueのブールベクトルを返します。which(...)
TRUEのインデックスを返します。数値を読み取ることは、通常、長いFALSEのベクトルで少数のTRUEを検索するよりも簡単であるため、見た目の改善につながるステップです。parts[...]
前のステップのインデックスを持つリストエントリのみを取得します。また、電子メールプレフィックスが3回以上出現する場合、重複は最初を超えて出現するたびにTRUEを返すため、ここにN-1回リストされることに注意してください。
そして真剣に。この説明を読む必要がある場合は、基本を学ぶまで整頓しないでください。Tidyverseは本当に強力なツールです。私が認める。しかし、それはすでに混沌としたRにさらなる混乱をもたらすので、Rをしっかりと把握していない限り、再考してください。