이메일 데이터에서 중복 확인

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 공포를 소환 할 필요가 없습니다.

의견에서 요청한 추가 설명 :

  1. strsplit(df$email, "@") 데이터 프레임에서 이메일 열을 가져와 "@"기호로 각 문자열을 구분합니다.
  2. first_parts = character() 빈 문자형 벡터를 만듭니다.
  3. for (i in 1:length(parts)) { first_parts[i] <- parts[[i]][1] } strsplit은 다소 투박한 목록을 생성하기 때문에 여기에서는 비교하고 싶은 이메일의 전반부 만 가져옵니다.
  4. duplicated(first_parts) 두 번째로 발견되는 모든 값에 대해 true 인 부울 벡터를 반환합니다.
  5. which(...)TRUE의 인덱스를 반환합니다. 숫자를 읽는 것이 일반적으로 긴 FALSE 벡터에서 몇 개의 TRUE를 검색하는 것보다 쉽기 때문에 외관상 개선에 더 가깝습니다.
  6. parts[...]이전 단계의 색인이있는 목록 항목 만 가져옵니다. 또한 이메일 접두사가 3 회 이상 발생하는 경우 여기에 N-1 회 나열됩니다. 복제는 처음 이후의 각 발생에 대해 TRUE를 반환하기 때문입니다.

그리고 진지하게. 이 설명을 읽어야한다면 기본 사항을 배울 때까지 깔끔하게 정리하지 마십시오. Tidyverse는 정말 강력한 도구입니다. 인정합니다. 그러나 그것은 이미 혼란스러운 R에 더 많은 혼란을 가져 오므로 R에 대한 확실한 이해가 없다면 재고하십시오.