이메일 데이터에서 중복 확인
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)
두 번째로 발견되는 모든 값에 대해 true 인 부울 벡터를 반환합니다.which(...)
TRUE의 인덱스를 반환합니다. 숫자를 읽는 것이 일반적으로 긴 FALSE 벡터에서 몇 개의 TRUE를 검색하는 것보다 쉽기 때문에 외관상 개선에 더 가깝습니다.parts[...]
이전 단계의 색인이있는 목록 항목 만 가져옵니다. 또한 이메일 접두사가 3 회 이상 발생하는 경우 여기에 N-1 회 나열됩니다. 복제는 처음 이후의 각 발생에 대해 TRUE를 반환하기 때문입니다.
그리고 진지하게. 이 설명을 읽어야한다면 기본 사항을 배울 때까지 깔끔하게 정리하지 마십시오. Tidyverse는 정말 강력한 도구입니다. 인정합니다. 그러나 그것은 이미 혼란스러운 R에 더 많은 혼란을 가져 오므로 R에 대한 확실한 이해가 없다면 재고하십시오.