중복 된 행 제거
CSV
파일을 R data.frame으로 읽었습니다 . 일부 행은 열 중 하나에서 동일한 요소를 갖습니다. 해당 열에 중복 된 행을 제거하고 싶습니다. 예를 들면 다음과 같습니다.
platform_external_dbus 202 16 google 1
platform_external_dbus 202 16 space-ghost.verbum 1
platform_external_dbus 202 16 localhost 1
platform_external_dbus 202 16 users.sourceforge 8
platform_external_dbus 202 16 hughsie 1
다른 행의 첫 번째 열에 동일한 데이터가 있으므로이 행 중 하나만 원합니다.
데이터 프레임을 필요한 열로 분리 한 다음 고유 함수를 사용하십시오.
# in the above example, you only need the first three columns
deduped.data <- unique( yourdata[ , 1:3 ] )
# the fourth column no longer 'distinguishes' them,
# so they're duplicates and thrown out.
중복 행 제거에 대한 일반적인 답변을 찾기 위해 여기에 온 사람들에게는 다음을 사용하십시오 !duplicated()
.
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)
duplicated(df)
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE
> df[duplicated(df), ]
a b
2 A 1
6 B 1
8 C 2
> df[!duplicated(df), ]
a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2
dplyr 패키지 의 함수 distinct()
는 임의의 중복 제거를 수행하여 (이 질문에서와 같이) 중복 변수를 지정하거나 모든 변수를 고려할 수 있습니다.
데이터:
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))
지정된 열이 중복 된 행을 제거하십시오.
library(dplyr)
dat %>% distinct(a, .keep_all = TRUE)
a b
1 1 A
2 2 B
다른 행과 완전히 중복 된 행을 제거하십시오.
dat %>% distinct
a b
1 1 A
2 2 B
3 1 C
4 2 D
data.table
패키지는 가지고 unique
와 duplicated
그 방법은 몇 가지 추가 기능을 보유하고 있습니다.
모두 unique.data.table
와 duplicated.data.table
방법은 추가가 by
당신이 통과 할 수 있도록 인수 character
또는 integer
각각 열 이름 또는 위치의 벡터를
library(data.table)
DT <- data.table(id = c(1,1,1,2,2,2),
val = c(10,20,30,10,20,30))
unique(DT, by = "id")
# id val
# 1: 1 10
# 2: 2 10
duplicated(DT, by = "id")
# [1] FALSE TRUE TRUE FALSE TRUE TRUE
이러한 방법의 또 다른 중요한 기능은 더 큰 데이터 세트에 대한 엄청난 성능 향상입니다.
library(microbenchmark)
library(data.table)
set.seed(123)
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10))
DT <- copy(DF)
setDT(DT)
microbenchmark(unique(DF), unique(DT))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18 100 b
# unique(DT) 746.855 776.6145 2201.657 864.932 919.489 55986.88 100 a
microbenchmark(duplicated(DF), duplicated(DT))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170 100 b
# duplicated(DT) 551.982 558.2215 851.0246 639.9795 663.658 5805.243 100 a
일반적인 대답은 다음과 같습니다.
df <- data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6))))
new_df <- df[-which(duplicated(df)), ]
산출:
X1 X2 X3
1 2 9 6
2 4 6 7
로 sqldf
:
# Example by Mehdi Nellen
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)
해결책:
library(sqldf)
sqldf('SELECT DISTINCT * FROM df')
산출:
a b
1 A 1
2 A 2
3 B 4
4 B 1
5 C 2
dplyr
의 distinct()
기능을 사용할 수도 있습니다 ! 특히 관측 값이 많은 경우 대체 옵션보다 더 효율적입니다.
distinct_data <- dplyr::distinct(yourdata)
Or you could nest the data in cols 4 and 5 into a single row with tidyr
:
library(tidyr)
df %>% nest(V4:V5)
# A tibble: 1 × 4
# V1 V2 V3 data
# <fctr> <int> <int> <list>
#1 platform_external_dbus 202 16 <tibble [5 × 2]>
The col 2 and 3 duplicates are now removed for statistical analysis, but you have kept the col 4 and 5 data in a tibble and can go back to the original data frame at any point with unnest()
.
참고URL : https://stackoverflow.com/questions/13967063/remove-duplicated-rows
'IT story' 카테고리의 다른 글
텍스트 길이를 기준으로 UILabel 너비를 계산하는 방법은 무엇입니까? (0) | 2020.06.27 |
---|---|
프로그래밍 방식으로 ColorStateList를 작성하는 방법 (0) | 2020.06.27 |
jQuery 체크 박스 이벤트 처리 (0) | 2020.06.27 |
데이터 테이블에서 행 정렬 (0) | 2020.06.27 |
Java에서 다른 사람의 나이를 어떻게 계산합니까? (0) | 2020.06.27 |