본문 바로가기
R

[dplyr] arrange, distinct, slice로 데이터 추출 및 정리

by phyzik 2024. 3. 5.

dplyr는 data handling을 위한 R에서 사용하는 필수 패키지 입니다. 그럼, dpyr에서 사용되는 기본 함수인 아래 3종류의 함수에 대해 알아보겠습니다.

  • arrange()
  • distinct()
  • slice()
library(dplyr)

 

## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

 

예제에 사용할 간단한 data.frame을 하나 만들어 보겠습니다.

x = c(10,20,20,30,10,20,10,30,30)
y = c(101,103,102,93,92,87,80,75,72)
z = c(50,51,52,45,12,22,34,56,12)
m = c(rep("a",4),rep("b",5))
n = seq(1,9)
df = data.frame(x,m, y, z,n)

#`r text_spec("Help Help", background = "#D05A6E", color = "white", bold = T)`

1. arrange

arrange()는 데이터의 순서를 정렬해주는 함수입니다. 기본값으로 오름차순(작은값 -> 큰값) 정리를 하며, desc를 적용하면 내림차순(큰값 -> 작은값)으로 정렬합니다. y값을 오름차순으로 정렬한 결과 입니다.

df %>% arrange(desc(y))
##    x m   y  z n
## 1 20 a 103 51 2
## 2 20 a 102 52 3
## 3 10 a 101 50 1
## 4 30 a  93 45 4
## 5 10 b  92 12 5
## 6 20 b  87 22 6
## 7 10 b  80 34 7
## 8 30 b  75 56 8
## 9 30 b  72 12 9

 

y를 desc로 내림차순으로 정리한 결과 입니다.

group별로 순서를 정렬할 때는, group_by를 적용 후, arrange함수안에서 .by_group=TRUE 옵션을 적용해야 합니다.

df %>% group_by(x) %>% arrange(desc(y), .by_group = TRUE)
## # A tibble: 9 × 5
## # Groups:   x [3]
##       x m         y     z     n
##   <dbl> <chr> <dbl> <dbl> <int>
## 1    10 a       101    50     1
## 2    10 b        92    12     5
## 3    10 b        80    34     7
## 4    20 a       103    51     2
## 5    20 a       102    52     3
## 6    20 b        87    22     6
## 7    30 a        93    45     4
## 8    30 b        75    56     8
## 9    30 b        72    12     9

x 안에서 y가 내림차순으로 정렬된 것을 볼 수 있습니다.

2. distinct

distinct()는 unique()와 같은 역할을 하는 함수입니다. column내에서 고유값만을 추출해주는 함수 입니다.

df %>% distinct(x)
##    x
## 1 10
## 2 20
## 3 30

 

.keep_all은 distinct()를 적용한 column을 제외한 나머지 column들도 보여주는 옵션입니다.

df %>% distinct(x, .keep_all = TRUE)
##    x m   y  z n
## 1 10 a 101 50 1
## 2 20 a 103 51 2
## 3 30 a  93 45 4

3. slice

slice()는 row를 중심으로 원하는 row의 갯수를 추출 하는 함수입니다. 

또, group_by()와 함께 적용 할 수 있습니다. 그룹별 순서에 해당하는 행을 추출 합니다.

df %>% group_by(m) %>% slice(2,4)
## # A tibble: 4 × 5
## # Groups:   m [2]
##       x m         y     z     n
##   <dbl> <chr> <dbl> <dbl> <int>
## 1    20 a       103    51     2
## 2    30 a        93    45     4
## 3    20 b        87    22     6
## 4    30 b        75    56     8

 

y를 기준으로 큰 값 순서대로 2개 행을 출력해보겠습니다.

df %>% slice_max(order_by = y, n = 2)
##    x m   y  z n
## 1 20 a 103 51 2
## 2 20 a 102 52 3

 

x를 기준으로 max를 출력해보겠습니다. x에는 10, 20, 30이 각각 3개씩 들어 있습니다. 여기서 n = 4를 적용하며, x에서 제일 큰값인 30에 해당하는 행과 그 다음 20에 해당하는 행이 모두 출력되는 것을 알 수 있습니다.

df %>% slice_max(order_by = x, n = 4)
##    x m   y  z n
## 1 30 a  93 45 4
## 2 30 b  75 56 8
## 3 30 b  72 12 9
## 4 20 a 103 51 2
## 5 20 a 102 52 3
## 6 20 b  87 22 6

 

slice_min()은 column을 기준으로 작은값을 순서대로 출력합니다.

df %>% slice_min(order_by = y, n = 1)
##    x m  y  z n
## 1 30 b 72 12 9

 

slice_sample()은 랜덤한 행을 출력합니다. n대신 prop을 사용하여 비율을 지정해줘도 됩니다.

df %>% slice_sample(n = 3)
##    x m  y  z n
## 1 10 b 92 12 5
## 2 10 b 80 34 7
## 3 20 b 87 22 6
df %>% slice_sample(prop = 0.3)
##    x m   y  z n
## 1 30 b  72 12 9
## 2 20 a 102 52 3
df %>% filter(x == 10)
##    x m   y  z n
## 1 10 a 101 50 1
## 2 10 b  92 12 5
## 3 10 b  80 34 7

 

slice()에 n()을 적용하면 마지막 행을 출력합니다.

df %>% slice(n())
##    x m  y  z n
## 1 30 b 72 12 9