programing tip

중복 된 행의 인덱스 찾기

itbloger 2020. 11. 18. 08:37
반응형

중복 된 행의 인덱스 찾기


이 질문에 이미 답변이 있습니다.

R에서 중복 된 함수는 중복 행 검색을 수행합니다. 중복을 제거하려면 쓰기 만하면 df[!duplicated(df),]데이터 프레임에서 중복이 제거됩니다.

그러나 중복 된 데이터의 인덱스를 찾는 방법은 무엇입니까? 경우 duplicated어떤 행에서 TRUE 반환, 뜻이 데이터 프레임에서 같은 행의 선두로부터 초이며, 인덱스를 용이하게 얻을 수있다. 이 행의 첫 번째 발생 색인을 얻는 방법은 무엇입니까? 즉, 중복 된 행이 동일한 인덱스입니까?

data.frame에서 루프를 만들 수 있지만이 질문에 대한 더 우아한 대답이 있다고 생각합니다.


이것은 논리적 인덱스 벡터를 반환합니다.

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]

예를 들면 다음과 같습니다.

df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])
#[1]  1  2  4  5  8  9 10

업데이트 (주석 기반) : 함수 인수로 사용
하면 명령의 복잡성을 줄일 수 있습니다 fromLast = TRUE. 이것은 두 개의 역 벡터를 만드는 것보다 쉽습니다.

duplicated(df) | duplicated(df, fromLast = TRUE)

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

어떻게 작동합니까?

이 기능 duplicated은 원래 데이터 프레임과 행 순서가 반대 인 데이터 프레임 모두에 적용됩니다. 후자의 출력이 다시 반전됩니다. 원래 데이터에서 중복 된 값의 첫 번째 발생은 반전 된 버전의 마지막 발생입니다. 그 후, 두 벡터는 둘 중 하나 이상이 중복 된 값을 나타 내기 |때문에를 사용하여 결합됩니다 TRUE.


당신이 사용하는 경우 키 입력 data.table를, 당신은 다음과 같은 우아한 구문을 사용할 수 있습니다

library(data.table)
DT <- data.table(A = rep(1:3, each=4), 
                 B = rep(1:4, each=3), 
                 C = rep(1:2, 6), key = "A,B,C")

DT[unique(DT[duplicated(DT)]),which=T]

포장을 풀려면

  • DT[duplicated(DT)] 중복 된 행의 하위 집합입니다.

  • unique(...)중복 된 행의 고유 한 조합 만 반환합니다. 이것은 중복이 1 개 이상인 경우를 다룹니다 (중복, 예 : 3 중 등).

  • DT[..., which = T]중복 행을 원본과 병합하고 which=T행 번호를 which = T반환합니다 (데이터 만 반환 하지 않음 ).

당신은 또한 사용할 수 있습니다

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]

참고 URL : https://stackoverflow.com/questions/12495345/find-indices-of-duplicated-rows

반응형