R에서 중복 값 찾기
이 질문에 이미 답변이 있습니다.
21638 개의 고유 한 * 행이있는 테이블이 있습니다.
vocabulary <- read.table("http://socserv.socsci.mcmaster.ca/jfox/Books/Applied-Regression-2E/datasets/Vocabulary.txt", header=T)
이 테이블에는 5 개의 열이 있으며 첫 번째 열에는 응답자 ID 번호가 있습니다. 두 번 나오는 응답자가 있는지 또는 모든 응답자가 고유한지 확인하고 싶습니다.
사용할 수있는 고유 ID를 계산하려면
length(unique(vocabulary$id))
그리고 내가 할 수있는 중복이 있는지 확인하기 위해
length(unique(vocabulary$id)) == nrow(vocabulary)
TRUE
중복이없는 경우 를 반환합니다 .
내 질문:
중복 값 또는 줄 번호를 반환하는 직접적인 방법이 있습니까?
추가 설명 :
duplicated()
는 "원본"을 제외한 엄격한 의미의 중복 만 반환하기 때문에 함수를 사용하는 데 해석 문제가 있습니다. 예를 들어 sum(duplicated(vocabulary$id))
또는 dim(vocabulary[duplicated(vocabulary$id),])[1]
중복 행의 수로 "5"를 반환 할 수 있습니다. 문제는 중복의 수만 알면 중복되는 행의 수를 알 수 없다는 것입니다. "5"는 각각 하나의 중복이있는 5 개의 행이 있음을 의미합니까, 아니면 5 개의 중복 된 행이있는 것입니까? 그리고 중복의 ID 나 줄 번호가 없기 때문에 "원본"을 찾을 수있는 방법이 없습니다.
* 이 설문 조사에 중복 된 ID가 없다는 것을 알고 있지만이 질문에 대한 다른 답변을 사용하면 찾을 수없는 건초 더미가 화면에 표시 duplicated(vocabulary$id)
되거나 table(vocabulary$id)
출력 될 것이기 때문에 좋은 예입니다. 가능한 희귀 중복 바늘.
사용할 수 있습니다 table
.
n_occur <- data.frame(table(vocabulary$id))
id
s 목록 과 발생 횟수가 포함 된 데이터 프레임을 제공합니다 .
n_occur[n_occur$Freq > 1,]
어떤 일 id
이 두 번 이상 발생했는지 알려줍니다 .
vocabulary[vocabulary$id %in% n_occur$Var1[n_occur$Freq > 1],]
둘 이상의 발생이있는 레코드를 반환합니다.
이렇게하면 중복 행이 제공됩니다.
vocabulary[duplicated(vocabulary$id),]
이것은 당신에게 중복의 수를 줄 것입니다 :
dim(vocabulary[duplicated(vocabulary$id),])[1]
예:
vocabulary2 <-rbind(vocabulary,vocabulary[1,]) #creates a duplicate at the end
vocabulary2[duplicated(vocabulary2$id),]
# id year sex education vocabulary
#21639 20040001 2004 Female 9 3
dim(vocabulary2[duplicated(vocabulary2$id),])[1]
#[1] 1 #=1 duplicate
편집하다
좋아요, 추가 정보와 함께해야 할 일은 다음과 같습니다 . 마지막부터 중복을 가져올 수 duplicated
있는 fromLast
옵션이 있습니다. 이것을 normal과 결합 duplicated
하면 모든 중복을 얻습니다. 다음 예제는 원본 어휘 객체에 중복을 추가합니다 (라인 1은 두 번 복제되고 라인 5는 한 번 복제 됨). 그런 다음 table
ID 당 총 중복 수를 가져 오는 데 사용 합니다.
#Create vocabulary object with duplicates
voc.dups <-rbind(vocabulary,vocabulary[1,],vocabulary[1,],vocabulary[5,])
#List duplicates
dups <-voc.dups[duplicated(voc.dups$id)|duplicated(voc.dups$id, fromLast=TRUE),]
dups
# id year sex education vocabulary
#1 20040001 2004 Female 9 3
#5 20040008 2004 Male 14 1
#21639 20040001 2004 Female 9 3
#21640 20040001 2004 Female 9 3
#51000 20040008 2004 Male 14 1
#Count duplicates by id
table(dups$id)
#20040001 20040008
# 3 2
여기에는 질문에 다른 결과를 반환 할 수있는 몇 가지 방법이 요약되어 있으므로주의하십시오.
# First assign your "id"s to an R object.
# Here's a hypothetical example:
id <- c("a","b","b","c","c","c","d","d","d","d")
#To return ALL MINUS ONE duplicated values:
id[duplicated(id)]
## [1] "b" "c" "c" "d" "d" "d"
#To return ALL duplicated values by specifying fromLast argument:
id[duplicated(id) | duplicated(id, fromLast=TRUE)]
## [1] "b" "b" "c" "c" "c" "d" "d" "d" "d"
#Yet another way to return ALL duplicated values, using %in% operator:
id[ id %in% id[duplicated(id)] ]
## [1] "b" "b" "c" "c" "c" "d" "d" "d" "d"
이 도움을 바랍니다. 행운을 빕니다.
다음 data.table
은 중복 개수와 함께 중복 항목을 나열 하는 솔루션입니다 (2 개의 복사본이있는 경우 1이되는 식으로 필요에 맞게 조정할 수 있음).
library(data.table)
dt = data.table(vocabulary)
dt[duplicated(id), cbind(.SD[1], number = .N), by = id]
다음 중 하나를 사용하는 간결한 방법 rev
:
x[!(!duplicated(x) & rev(!duplicated(rev(x))))]
...보다는 fromLast
:
x[!(!duplicated(x) & !duplicated(x, fromLast = TRUE))]
... and as a helper function to provide either logical vector or elements from original vector :
duplicates <- function(x, as.bool = FALSE) {
is.dup <- !(!duplicated(x) & rev(!duplicated(rev(x))))
if (as.bool) { is.dup } else { x[is.dup] }
}
Treating vectors as data frames to pass to table
is handy but can get difficult to read, and the data.table
solution is fine but I'd prefer base R solutions for dealing with simple vectors like IDs.
ReferenceURL : https://stackoverflow.com/questions/16905425/find-duplicate-values-in-r
'developer tip' 카테고리의 다른 글
값 개체는 데이터베이스에 어떻게 저장됩니까? (0) | 2021.01.06 |
---|---|
jQuery UI Datepicker에서 minDate를 현재 날짜로 설정하는 방법은 무엇입니까? (0) | 2021.01.05 |
React.js의 부트 스트랩 모달 (0) | 2021.01.05 |
일반적인 예외를 잡는 것이 정말 나쁜가요? (0) | 2021.01.05 |
$ _GET이 비어 있는지 확인하는 방법은 무엇입니까? (0) | 2021.01.05 |