패키지 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