패키지 dplyr 00: magrittr
dplyr
패키지를 활용한 데이터 가공 1: magrittr
의 파이프 연산자
dplyr
패키지의 함수과magrittr
패키지의%>%
연산을 함께 활용하면 데이터 가공이 간단하고 이해하기 쉽다. 여기서는 파이프 연산이라고 불리는%>%
에 대해서 알아본다.dplyr
패키지를 활용한 데이터 사전처리의 목차는 다음과 같다.magrittr
의%>%
dplyr
을 사용한 부분 참조dplyr
을 사용한 수정dplyr
의 그 밖의 편의 기능
magrittr
패키지의 파이프
- 하나의 대상에 여러 함수를 연속적으로 적용하는 경우, 괄호가 연속적으로 중첩되어 가독성이 떨어진다. 예를 들어
diamond
에head
와dim
함수를 적용한다면, 다음과 같다.
data(diamonds , package='ggplot2')
dim(head(diamonds , n=4))
## [1] 4 10
magrittr
패키지의%>%
과.
를 활용하면 복잡하게 중첩된 괄호를 쓸 필요가 없다.
library(magrittr)
diamonds %>% head(., n=4) %>% dim(.)
## [1] 4 10
.
은%>%
이전의 결과를 나타낸다. 따라서 첫 번째.
은diamonds
를 두번째.
는head(diamonds, n=4)
의 결과를 나타낸다. 만약.
이 함수의 첫 번째 인자로 쓰일 경우에는 다음과 같이 생략할 수 있다.head(., n=4)
와dim(.)
의.
를 모두 생략하였다.
diamonds %>% head(n=4) %>% dim()
## [1] 4 10
그리고 dim()
처럼 인자가 .
뿐인 경우에는 괄호까지 생략할 수 있다.
diamonds %>% head(n=4) %>% dim
## [1] 4 10
- 다른 예를 들어보자. (이런 것도 가능하다!)
diamonds %>% .$price %>% .[1:10]
## [1] 326 326 327 334 335 336 336 337 337 338
diamonds %>% .[["price"]] %>% .[1:10]
## [1] 326 326 327 334 335 336 336 337 337 338
- 위에서 다룬
diamonds
데이터는 데이터 프레임으로 보이지만 사실tibble
(티블)이라는 데이터 형식이다. 이를 확인하기 위해class
함수를 사용할 수도 있고,tibble
이나dplyr
패키지를 불어들인 후diamonds
를 다시 확인해 볼 수도 있다.
class(diamonds)
## [1] "tbl_df" "tbl" "data.frame"
library(dplyr)
diamonds
## # A tibble: 53,940 x 10 ## carat cut color clarity depth table price x y z ## <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> ## 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 ## 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 ## 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 ## 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 ## 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 ## 6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 ## 7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 ## 8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 ## 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 ## 10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 ## # ... with 53,930 more rows
class
함수의 결과는diamonds
가 데이터프레임(data.frame
) 과 호환되는 티블(tibble
,tbl_df
) 형식임을 알려준다. 티블은 데이터를 좀 더 깔끔하게 표시한다.carat, cut, ...
은 열이름,<dbl>, <ord>, ...
은 각 열의 데이터 형식을 나타내며, 화면의 가로, 세로 너비를 넘어가는 행과 열은 생략된다. (만약 출력되는 행의 수와 열의 수를 정하고 싶다면print(diamonds, n=, width=)
을 활용한다.)- 왼쪽 가장자리의
1, 2, ...
는 행의 순서를 보여준다. 마지막으로... with 53,930 more rows
는 화면에 표시되지 않은 열의 수를 나타낸다. - 티블은 데이터 프레임과 달리 열 이름의 일부를 사용하여 열을 참조할 수 없다(다른 말로 partial matching이 불가능하다). 다음의 코드를 보자.
diaTB
,diaDF
는 동일한 자료를 티블과 데이터 프레임 형식으로 저장하고 있다.price
열을 부분 이름pri
을 써서 참조하려고 하고 있다.diaDF$pri
는 가능하지만diaTB$pri
는 불가능하다.
diaTB <- as_tibble(diamonds[1:10, ])
diaDF <- as.data.frame(diamonds[1:10, ])
diaDF$pri
## [1] 326 326 327 334 335 336 336 337 337 338
diaDF[, 'pri']
## Error in `[.data.frame`(diaDF, , "pri"): undefined columns selected
diaTB$pri
## Warning: Unknown or uninitialised column: 'pri'.
## NULL
diaTB[, 'pri']
## Error: Can't find column `pri` in `.data`.
- 그 밖에도 티블은 생성시 문자열을 범주형(
factor
)으로 바꾸지 않는다는 차이가 있다.
df <- data.frame(a = c('Kim','Lee','Park'))
tb <- tibble(a = c('Kim','Lee','Park'))
class(df$a)
## [1] "factor"
class(tb$a)
## [1] "character"
Leave a comment