본문 바로가기
R/데이터 전처리

[R] dplyr의 filter, arrange 사용법

by ssanalyst 2020. 12. 6.
728x90

안녕하세요.

 

오늘은 dplyr 패키지의 filter와 arrange 함수 사용법에 대해 알아보도록 하겠습니다.

게시글을 보시면 dplyr의 pipe operator와 함수에 대해 간략히 적어놓았습니다.

 

그럼 먼저 filter 함수에 대해 알아보겠습니다.


 

filter

 

filter 함수는 이름처럼 데이터를 조건에 맞게 걸러주는 기능을 합니다.

R 기본 인덱싱의 기능과 똑같다고 생각하시면 됩니다.

 

filter는 원하는 조건에 해당하는 행(row)만을 추출해줍니다.

이전 게시글에서처럼 iris 데이터를  예시로 사용하겠습니다.

filter 함수 예시는 아래 코드와 같습니다.

> dat <- filter(iris, Species=="setosa")
> dat
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa

> iris %>% filter(Species=="setosa")
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa

위의 2가지 방법은 모두 동일한 결과를 산출합니다. iris 데이터에서 species가 ' setosa '인 열(row)만 추출한 결과입니다.

pipe operator( %>% )을 사용하지 않으신다면, filter(사용할 데이터 이름, 필터조건)으로 해당 함수를 사용할 수 있습니다.

pipe operator( %>% )을 사용한다면 사용할 데이터 이름 %>% filter(필터조건)으로 사용가능합니다.

filter 함수를 사용하실 때 조건을 다양하게 부여할 수 있습니다.

OR와 AND의 조건을 사용하는 방법을 보여드리겠습니다.

일단 먼저 R에서 조건문 OR는 ' | ' 을 사용합니다.

 

저 기호는 Shift 키를 누르시고 원화(₩)자판을 누르시면 입력됩니다.

그리고 AND는 조건은 ' & '을 사용합니다.

OR와 AND 조건을 사용한 filter 이용법은 아래 코드와 같습니다.

> dat
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
101          6.3         3.3          6.0         2.5  virginica
102          5.8         2.7          5.1         1.9  virginica

iris %>% filter(Sepal.Length >= 3 | Species=="setosa")
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
101          6.3         3.3          6.0         2.5  virginica
102          5.8         2.7          5.1         1.9  virginica

위의 결과는 Sepal.Length가 3 이상이거나 Species는 ' setosa '인 데이터를 추출한 결과입니다.

 

그리고 위 코드 결과는 자료의 길이가 길어 일부분만을 적어두었습니다.

dat$Sepal.Length < 3
  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [16] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [31] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [46] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [76] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [91] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[106] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[136] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

결과를 보시면 Sepal.Length가 3 미만인 데이터는 추출되지 않았습니다.

 

이제 AND를 사용해보도록 하겠습니다.

> dat
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa")
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

위의 코드가 AND 조건을 적용한 결과입니다.

 

Sepal.Length가 3 이상이면서 Species는 ' setosa '인 데이터만을 추출하였습니다.

filter에 조건을 더 추가하여 사용하실 수 있습니다.

그러면 filter와 select의 차이는 무엇이냐? 라고 생각하실 수 있습니다.

"select는 사용할/원하는 열(column)을 뽑아줍니다. 반대로 filter는 필터조건에 부합하는 행(row)을 뽑아주는 것이 차이입니다."


 

arrange

 

이번에는 arrange 함수에 대해 알아보겠습니다.

 

arrange는 정렬 기능이 있는 함수입니다.

arrange는 오름차순, 내림차순 정렬과 원하는 기준값으로 설정하여 정렬도 가능합니다.

arrange 함수는 오름차순을 기본값/디폴트로 합니다.

위에 사용한 iris 데이터와 filter 명령어에 arrange함수를 붙여 사용예시를 보여드리도록 하겠습니다.

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa")
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

위의 결과는 arrange 함수를 사용하기 전의 결과입니다. 이제 arrange 함수를 적용시켜 보겠습니다.

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa") %>% arrange(Sepal.Length)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           4.3         3.0          1.1         0.1  setosa
2           4.4         2.9          1.4         0.2  setosa
3           4.4         3.0          1.3         0.2  setosa
4           4.4         3.2          1.3         0.2  setosa
5           4.5         2.3          1.3         0.3  setosa
6           4.6         3.1          1.5         0.2  setosa
7           4.6         3.4          1.4         0.3  setosa
8           4.6         3.6          1.0         0.2  setosa
9           4.6         3.2          1.4         0.2  setosa
10          4.7         3.2          1.3         0.2  setosa

위의 결과를 보시면 arrange 함수를 사용해서 Sepal.Length를 기준으로 오름차순 정렬된 것을 보실 수 있습니다.

arrange(변수명)으로 정렬 기능을 사용하실 수 있습니다.

arrange 역시 하나의 변수만이 아닌 여러 변수를 한번에 정렬할 수 있습니다.

아래 코드를 보시길 바랍니다.

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa") %>% arrange(Sepal.Length, Sepal.Width)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           4.3         3.0          1.1         0.1  setosa
2           4.4         2.9          1.4         0.2  setosa
3           4.4         3.0          1.3         0.2  setosa
4           4.4         3.2          1.3         0.2  setosa
5           4.5         2.3          1.3         0.3  setosa
6           4.6         3.1          1.5         0.2  setosa
7           4.6         3.2          1.4         0.2  setosa
8           4.6         3.4          1.4         0.3  setosa
9           4.6         3.6          1.0         0.2  setosa
10          4.7         3.2          1.3         0.2  setosa

위 결과는 Sepal.Length와 Sepal.Width를 기준으로 정렬한 결과입니다.

결과를 보시면 arrange 함수에서 제일 먼저 사용한 Sepal.Length로 먼저 오름차순 정렬이 되고,

그 후 정렬된 Sepal.Length값에 맞게 Sepal.Width가 오름차순 정렬된 것을 보실 수 있습니다.

 

다음은 내림차순으로 정렬하는 방법에 대해 보도록 하겠습니다.

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa") %>% arrange(desc(Sepal.Length))
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.8         4.0          1.2         0.2  setosa
2           5.7         4.4          1.5         0.4  setosa
3           5.7         3.8          1.7         0.3  setosa
4           5.5         4.2          1.4         0.2  setosa
5           5.5         3.5          1.3         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           5.4         3.7          1.5         0.2  setosa

위 결과를 보시면 Sepal.Length가 내림차순 정렬된 것을 확인할 수 있습니다.

내림차순 정렬을 하려면 변수명 앞에 desc를 붙여주시면 됩니다. ex) arrange(desc(Sepal.Length))

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa") %>% arrange(desc(Sepal.Length, Sepal.Width))
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.8         4.0          1.2         0.2  setosa
2           5.7         4.4          1.5         0.4  setosa
3           5.7         3.8          1.7         0.3  setosa
4           5.5         4.2          1.4         0.2  setosa
5           5.5         3.5          1.3         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           5.4         3.7          1.5         0.2  setosa
8           5.4         3.9          1.3         0.4  setosa
9           5.4         3.4          1.7         0.2  setosa
10          5.4         3.4          1.5         0.4  setosa

위 결과는 Sepal.Length와 Sepal.Width를 내림차순으로 정렬한 결과입니다.

 

위의 오름차순과는 반대의 결과를 보실 수 있습니다.

arrange를 이용하면 자료 정렬도 한 변수는 오름차순, 다른 변수는 내림차순으로 정렬할 수 있습니다.

> iris %>% filter(Sepal.Length >= 3 & Species=="setosa") %>% arrange(Sepal.Length, desc(Sepal.Width))
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           4.3         3.0          1.1         0.1  setosa
2           4.4         3.2          1.3         0.2  setosa
3           4.4         3.0          1.3         0.2  setosa
4           4.4         2.9          1.4         0.2  setosa
5           4.5         2.3          1.3         0.3  setosa
6           4.6         3.6          1.0         0.2  setosa
7           4.6         3.4          1.4         0.3  setosa
8           4.6         3.2          1.4         0.2  setosa
9           4.6         3.1          1.5         0.2  setosa
10          4.7         3.2          1.3         0.2  setosa

위 결과는 Sepal.Length는 오름차순으로 Sepal.Width는 내림차순으로 정렬한 결과입니다.

원하는 정렬 방식으로 원하는 변수를 arrange 함수를 이용하여 정렬할 수 있습니다.

마지막으로 집단(그룹)별로 정렬하는 방법에 대해 알아보도록 하겠습니다.

 

dplyr을 이용하여 그룹화하기 위해서는 group_by 함수를 사용하시면 됩니다.

group_by 예시에서는 R의 "mtcars" 데이터를 사용하도록 하겠습니다.

> mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
-------------------------------------- 중략 ----------------------------------
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

mtcars 데이터는 위처럼 구성되어 있습니다. 결과가 너무 길어 중략했습니다.

 

mtcars 데이터에서 am 변수를 이용하겠습니다.

am으로 그룹화 해보겠습니다. am은 기어변수이며 0은 Auto, 1은 수동을 의미합니다.

mtcars %>% group_by(am) %>% arrange(mpg, .by_group=T)
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
2  10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
3  13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
4  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
5  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
6  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
7  15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
8  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
9  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
10 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
20 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
21 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
22 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
23 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
24 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
25 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
26 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1

자료를 am으로 그룹화하고 mpg를 기준으로 오름차순 정렬한 결과입니다.

그룹화 시킬 변수는 group_by(변수명)으로 지정해주시고, arrange함수에 .by_group=T를 넣어주시면 그룹별로 정렬이 됩니다.

.by_group=T 를 안 넣으시면 그룹별로 정렬되지 않습니다.

결과를 보시면 am 0인 데이터의 mpg는 그 안에서 오름차순 정렬되었고, am 1인 데이터도 역시 그 안에서 mpg가 정렬된 것을 보실 수 있습니다.

역시 내림차순과 오름차순 조합도 가능합니다.

다음에는 summarizemutate 함수에 대해 포스팅 하겠습니다.

감사합니다 :)

728x90

댓글