작은 첨자를 가진 요소를 포함하여 모든 중복 행 찾기
R'sduplicated
벡터 또는 데이터 프레임의 각 요소가 작은 첨자를 가진 요소의 중복인지 여부를 나타내는 벡터를 반환합니다., 하면 따행 5행 3행, 4행, 5이 5일,duplicated
내게 벡터를 줄 것입니다.
FALSE, FALSE, FALSE, TRUE, TRUE
하지만 이 경우에는 정말로 제가 얻고 싶은 것은
FALSE, FALSE, TRUE, TRUE, TRUE
즉, 행이 더 큰 첨자를 가진 행에 의해 중복되는지 여부를 알고 싶습니다.
duplicated
을 가지고 있습니다.fromLast
논쟁. 의예섹의 "?duplicated
사용 방법을 보여 줍니다.그냥 전화하세요.duplicated
번,한은 두번, 한번과 함께fromLast=FALSE
한 은 고한번은리와 함께.fromLast=TRUE
행 중 합니다.TRUE
.
일부 후기 편집:당신은 재현 가능한 예를 제공하지 않았으므로, 여기 @jbaums가 친절하게 기여한 그림이 있습니다.
vec <- c("a", "b", "c","c","c")
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)]
## [1] "c" "c" "c"
편집: 데이터 프레임의 예:
df <- data.frame(rbind(c("a","a"),c("b","b"),c("c","c"),c("c","c")))
df[duplicated(df) | duplicated(df, fromLast=TRUE), ]
## X1 X2
## 3 c c
## 4 c c
은 해야 합니다.duplicated
값, 용unique
그런 다음 테스트를 수행합니다.%in%
항상 그렇듯이, 샘플 문제가 이 프로세스를 활성화합니다.
> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
> vec %in% unique(vec[ duplicated(vec)])
[1] FALSE FALSE TRUE TRUE TRUE
은 데터프중행다은음사얻으로 얻을 수 있습니다.dplyr
함으로써
library(tidyverse)
df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()
열을 은 다음과 같습니다.group_by_at(vars(-var1, -var2))
대신 데이터를 그룹화하는 데 사용할 수 있습니다.
데이터뿐만 아니라 행 인덱스가 실제로 필요한 경우 다음과 같이 먼저 추가할 수 있습니다.
df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)
@Joshua Ulrich의 솔루션을 함수로 소개합니다.이 형식을 사용하면 중복()을 사용하는 것과 동일한 방식으로 이 코드를 사용할 수 있습니다.
allDuplicated <- function(vec){
front <- duplicated(vec)
back <- duplicated(vec, fromLast = TRUE)
all_dup <- front + back > 0
return(all_dup)
}
동일한 예 사용:
vec <- c("a", "b", "c","c","c")
allDuplicated(vec)
[1] FALSE FALSE TRUE TRUE TRUE
저도 같은 질문을 받았고, 제가 틀리지 않았다면 이것도 답입니다.
vec[col %in% vec[duplicated(vec$col),]$col]
하지만 현재 사용 중인 데이터 세트는 시간 차이가 많이 나는 테스트를 수행할 만큼 충분히 크지 않습니다.
비슷한 문제가 있었지만 특정 열에 있는 값으로 중복된 행을 식별해야 했습니다.저는 다음과 같은 dplyr 솔루션을 생각해냈습니다.
df <- df %>%
group_by(Column1, Column2, Column3) %>%
mutate(Duplicated = case_when(length(Column1)>1 ~ "Yes",
TRUE ~ "No")) %>%
ungroup()
코드는 특정 열을 기준으로 행을 그룹화합니다.그룹의 길이가 1보다 클 경우 코드는 그룹의 모든 행을 중복된 것으로 표시합니다.작업이 완료되면 사용할 수 있습니다.Duplicated
필터링 등을 위한 열
이 이런식로의 방법입니다.vctrs::vec_duplicate_detect()
작동하다
# on a vector
vctrs::vec_duplicate_detect(c(1, 2, 1))
#> [1] TRUE FALSE TRUE
# on a data frame
vctrs::vec_duplicate_detect(mtcars[c(1, 2, 1),])
#> [1] TRUE FALSE TRUE
reprex 패키지(v2.0.1)에 의해 2022-07-19에 생성되었습니다.
특정 열에 대해 어떤 행이 중복되는지 관심이 있는 경우 다음과 같은 방법을 사용할 수 있습니다.
ddply(df, .(col1, col2), function(df) if(nrow(df) > 1) df else c())
dplyr을 사용하여 카운트 변수 추가:
df %>% add_count(col1, col2) %>% filter(n > 1) # data frame
df %>% add_count(col1, col2) %>% select(n) > 1 # logical vector
중복 행의 경우(모든 열 고려):
df %>% group_by_all %>% add_tally %>% ungroup %>% filter(n > 1)
df %>% group_by_all %>% add_tally %>% ungroup %>% select(n) > 1
이러한 방법의 이점은 중복 항목 수를 컷오프로 지정할 수 있다는 것입니다.
이것은 최근 버전의 dplyr(예: 1.0.5)을 반영하도록 @Holger Brandl의 답변을 업데이트합니다.group_by_all()
그리고.group_by_at()
대체되었습니다.도움말 문서는 다음을 사용할 것을 제안합니다.across()
대신.
따라서 중복이 있는 모든 행을 가져오려면 다음 작업을 수행할 수 있습니다.iris %>% group_by(across()) %>% filter(n() > 1) %>% ungroup()
이러한 행의 인덱스를 포함하려면 'rowid' 열을 추가하되 그룹에서 제외합니다.iris %>% rowid_to_column() %>% group_by(across(!rowid)) %>% filter(n() > 1) %>% ungroup()
추가%>% pull(rowid)
위의 내용 다음에 인덱스 벡터를 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/7854433/finding-all-duplicate-rows-including-elements-with-smaller-subscripts
'programing' 카테고리의 다른 글
Firebase - ref와 child의 차이점은 무엇입니까? (0) | 2023.06.04 |
---|---|
NSDate를 unix timestamp iphone sdk로 변환하는 방법은 무엇입니까? (0) | 2023.06.04 |
Python에서 객체의 속성을 열거하는 방법은 무엇입니까? (0) | 2023.06.04 |
특정 문자열을 포함하는 행 필터링 (0) | 2023.06.04 |
표준 오류 스트림에서 로깅을 사용하지 않도록 설정하는 방법은 무엇입니까? (0) | 2023.06.04 |