중복된 행 제거
나는 읽은 적이 있습니다.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
다른 행은 첫 번째 열에 있는 데이터가 동일하기 때문에 이 행 중 하나만 원합니다.
중복 행 제거에 대한 일반적인 답을 찾기 위해 여기에 온 사용자는!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
기본적으로 이 메서드는 각 복제의 첫 번째 항목을 유지합니다.인수를 사용할 수 있습니다.fromLast = TRUE
대신 각 복제의 마지막 항목을 유지합니다.이 단계 전에 데이터를 정렬하여 원하는 행을 유지할 수 있습니다.
데이터 프레임을 필요한 열로 분리한 다음 고유한 기능을 사용합니다.d
# 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.
패키지의 함수는 특정 열/변수(이 질문에서와 같이)에서 또는 모든 열/변수를 고려하여 임의의 중복 제거를 수행합니다. dplyr
의 일부입니다.
데이터 및 패키지
library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))
특정 열(예: 열)에서 중복된 행 제거a
)
참고:.keep_all = TRUE
모든 열을 유지하고, 그렇지 않으면 열만 유지합니다.a
유지될 것입니다.
distinct(dat, a, .keep_all = TRUE)
a b
1 1 A
2 2 B
다른 행과 완전히 중복된 행을 제거합니다.
distinct(dat)
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
여기 매우 간단하고 빠른 것이 있습니다.dplyr
/tidy
솔루션:
완전히 동일한 행을 제거합니다.
library(dplyr)
iris %>%
distinct(.keep_all = TRUE)
특정 열에서만 동일한 행 제거:
iris %>%
distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)
와 함께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
데이터 프레임의 중복 행 제거
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe
distinct(mydata)
이 데이터 집합에는 중복된 행이 하나도 없으므로 내 데이터와 동일한 행 수를 반환했습니다.
하나의 변수를 기준으로 중복 행 제거
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe using carb variable
distinct(mydata,carb, .keep_all= TRUE)
.keep_all 함수는 출력 데이터 프레임의 다른 모든 변수를 유지하는 데 사용됩니다.
여러 변수를 기준으로 중복 행 제거
library(dplyr)
mydata <- mtcars
# Remove duplicate rows of the dataframe using cyl and vs variables
distinct(mydata, cyl,vs, .keep_all= TRUE)
그.keep_all
함수는 출력 데이터 프레임의 다른 모든 변수를 유지하는 데 사용됩니다.
(출처: http://www.datasciencemadesimple.com/remove-duplicate-rows-r-using-dplyr-distinct-function/ )
콜 와 콜 를 또 4과 5열 데 다 같 단 행 중 에 수 있 습 니 다 첩 할 일 는 은 열 과 음 를 터 이 의 ▁with ▁the ▁row 니 ▁single 다 습 있 ▁or ▁a ▁in s ▁into ▁nest ▁data또▁could▁and는 ▁you ▁col▁4▁4▁5수열열중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]>
분석을 2및 3 항목은 4 및 5, "col 2" 및 "3", "col 4" 및 "5"를 사용하여 수 .unnest()
.
이 문제는 각 그룹에서 그룹이 고유한 값을 선택할 열인 첫 번째 행을 선택하여 해결할 수도 있습니다(공유된 예에서는 첫 번째 열만 선택).
기준 R 사용:
subset(df, ave(V2, V1, FUN = seq_along) == 1)
# V1 V2 V3 V4 V5
#1 platform_external_dbus 202 16 google 1
dplyr
library(dplyr)
df %>% group_by(V1) %>% slice(1L)
는사용을 사용합니다.data.table
library(data.table)
setDT(df)[, .SD[1L], by = V1]
여러 열을 기준으로 고유한 행을 찾아야 하는 경우 위의 각 답변에 대해 해당 열 이름을 그룹화 부분에 추가하면 됩니다.
데이터.
df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L),
.Label = "platform_external_dbus", class = "factor"),
V2 = c(202L, 202L, 202L, 202L, 202L), V3 = c(16L, 16L, 16L,
16L, 16L), V4 = structure(c(1L, 4L, 3L, 5L, 2L), .Label = c("google",
"hughsie", "localhost", "space-ghost.verbum", "users.sourceforge"
), class = "factor"), V5 = c(1L, 1L, 1L, 8L, 1L)), class = "data.frame",
row.names = c(NA, -5L))
더미 데이터 프레임 생성:
df=data.frame(id=c(11,11,33,44,44),
pages=c(32,32,33,22,22),
name=c("spark","spark","R","java","jsp"),
chapters=c(76,76,11,15,15),
price=c(144,144,321,567,567))
중복 행을 제거하려면 다음과 같이 하십시오.
df2 <- df[!duplicated(df), ]
단일 열로 중복 제거
df2 <- df[!duplicated(df$id), ]
선택한 열의 중복을 제거하는 방법
df2 <- unique( df[ , c('id','pages','chapters','price') ] )
dplyr을 사용하여 중복 행 제거(모든 열)
library(dplyr)
df2 <- df %>% distinct()
특정 열의 중복을 제거하는 방법
df2 <- df %>% distinct(id, .keep_all = TRUE)
선택한 열의 중복을 제거하는 방법
df2 <- df %>% distinct(id,pages, .keep_all = TRUE)
data.table을 사용하여 중복 제거
library(data.table)
dt <- data.table(df)
특정 열의 중복을 제거하는 방법
dt2 <- unique(dt, by = "id")
언급URL : https://stackoverflow.com/questions/13967063/remove-duplicated-rows
'programing' 카테고리의 다른 글
특정 텍스트를 포함하는 요소에 대한 CSS 선택기가 있습니까? (0) | 2023.06.18 |
---|---|
python의 멀티프로세싱 풀에서 키보드 인터럽트 (0) | 2023.06.18 |
Ruby에서 파일을 만드는 방법 (0) | 2023.06.18 |
파이썬에서 모니터 해상도를 얻으려면 어떻게 해야 합니까? (0) | 2023.06.18 |
여러 열을 함께 붙여넣기 (0) | 2023.06.18 |