developer tip

R에서 중복 값 찾기

copycodes 2021. 1. 5. 08:15
반응형

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

ids 목록 과 발생 횟수가 포함 된 데이터 프레임을 제공합니다 .

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는 한 번 복제 됨). 그런 다음 tableID 당 총 중복 수를 가져 오는 데 사용 합니다.

#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

반응형