[R] 연산자(Operator) 종류 및 사용법 - 중급편

해당 포스트는 R 연산자 종류 및 사용법 - 중급편을 소개합니다.

r-operator


Lists
[R] 연산자(Operator) 종류 및 사용법 - 기초편
[R] 연산자(Operator) 종류 및 사용법 - 초급편
[R] 연산자(Operator) 종류 및 사용법 - 중급편
[R] 연산자(Operator) 종류 및 사용법 - 고급편


INTRO

R을 사용하면서 프로그래밍 스킬도 중요하지만 함수 및 연산자에 대한 이해만 가지더라도 효율적인 R활용이 가능합니다. 이번 포스트에서는 R에서 기본적으로 제공하는 연산자들을 소개하고 예시와 함께 사용법을 설명합니다.


참고로 이번에 설명하는 연산자들은 magrittr 패키지에서 제공되는 연산자들입니다.

1. 체인 연산 결과 저장 : %<>%

앞서 설명했던 체인 연산(파이프)에서 마지막 결과를 저장하기 위해서는 일반적으로 할당 기호(화살표 또는 등호)를 이용합니다. 하지만 magrittr 패키지에서 제공하는 %<>% 연산자를 사용하면 추가 할당 기호 사용없이 처음 입력된 객체에 최종 결과를 저장할 수 있습니다.

만약, mtcars 데이터에서 mpg가 15 이상인 데이터들만 추출하여 출력해 본다면 아래와 같이 사용할 수 있습니다.

library(magrittr)
library(dplyr)

mtcars %>% 
  filter(mpg > 15)
                   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
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C         17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE        16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
...


여기서 필터링된 결과를 mtcars_sub 객체에 다시 저장한다면 일반적으로 아래 2가지 방법을 사용할 수 있습니다.

# 방법1
mtcars %>% 
  filter(mpg > 15) -> mtcars_sub

# 방법2
mtcars_sub <- mtcars %>% 
  filter(mpg > 15)


만약, 위와 같이 새로운 객체에 저장하는 것이 아닌 기존 객체에 덮어씌워도 된다면 위에서 설명한 %<>% 연산자를 사용하시는 것이 훨씬 간편합니다. 사용법은 아래와 같습니다.

mtcars %<>%
  filter(mpg > 15)
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
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C         17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE        16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3


위에서 사용했던 '방법1'과 출력 결과가 동일한 것을 확인할 수 있으며, 개인적으로는 새로운 객체에 할당하는 경우가 많이 '방법1'을 선호하지만 추가적인 메모리 사용이 발생하기에 반드시 새로운 객체가 필요한 상황이 아니면 해당 연산자를 활용하는 것도 좋은 선택이 될 수 있습니다.

2. 열 접근 오퍼레이터 : %$%

R에서 기본적으로 컬럼명을 다룰려면 앞에 객체명을 함께 사용해 주어야 합니다. 예를 들어, mtcarsmpghpplot()을 그린다면 아래와 같이 코드를 사용합니다.

plot(mtcars$mpg, mtcars$hp)


다른 방법으로는 with() 함수를 이용해 객체명을 고정하고, 컬럼에 접근하는 방법도 있습니다.

with(mtcars, plot(mpg, hp))


with()문과 동일한 역할을 파이프 연산에서는 %$% 연산자로 사용할 수 있습니다. 즉, %$% 연산자 왼쪽의 객체를 고정하여 컬럼에 접근할 수 있도록 지원해 주는 연산자라고 생각하면 됩니다.

library(magrittr)
library(dplyr)

mtcars %$% plot(mpg, hp)

r-operator-plot

3. 티 파이프(Tee pipe) : %T>%

티 파이프(Tee pipe)는 파이프(pipe, %>%)와 유사하게 동작하지만, 결과값을 리턴하지 않고 %T>% 왼쪽값을 그대로 다시 리턴한다는 점에서 차이가 있습니다. 이는 연산중에 plot() 함수와 같이 리턴되는 결과값이 없어 파이프 연산이 더이상 진행되지 못하는 경우를 방지할 수 있다는 장점이 있습니다.

사용 예시는 아래와 같습니다.

rnorm(200) %>% 
  matrix(ncol = 2) %>%
  plot() %>% 
  colSums()

r-operator-plot

r-operator-tee-pipe
%T>% 미사용시 에러 발생

위 예시를 보면 plot() 함수까지는 정상적으로 출력되었지만, plot()의 리턴값이 없어 colSums()이 계산되지 못하고 에러가 발생한 것을 볼 수 있습니다. 아래에서는 %T>%를 사용해 보겠습니다.

rnorm(200) %>% 
  matrix(ncol = 2) %T>%
  plot() %>% 
  colSums()

r-operator-plot

r-operator-tee-pipe
%T>% 사용 정상 출력

해당 코드를 실행한 결과 plot() 출력과 colSums() 계산이 모두 정상적으로 이루어진 것을 볼 수 있습니다.

위 실행 과정을 단계별로 나누어 본다면 아래와 같습니다.

%T>% 미사용시,

  1. rnorm(200) %>% matrix(ncol = 2) -> 리턴값 : matrix(ncol = 2)
  2. matrix(ncol = 2) %>% plot() -> 리턴값 없음
  3. plot() %>% colSums() -> 리턴값 : lhs 입력 없어 오류 발생

%T>% 사용시,

  1. rnorm(200) %>% matrix(ncol = 2) -> 리턴값 : matrix(ncol = 2)
  2. matrix(ncol = 2) %T>% plot() -> 리턴값 : matrix(ncol = 2)
  3. matrix(ncol = 2) %>% colSums() -> 리턴값 : colSums()


위 과정을 보면 2번의 %T>% 사용으로 함수의 리턴 결과가 달라지고, 3번에 입력값이 달라지는 것을 볼 수 있습니다. %T>% 연산자를 활용한다면 plot() 외에도 write.csv() 등의 함수와도 함께 사용할 수 있으니 사용법을 익혀두면 좋을 것 같습니다.

관련 링크

[1] 슬기로운통계생활 Youtube - 이거 외계어 아니야? R 연산자 (operator) 부시기! 고급편!
[2] [R] 연산자(Operator) 종류 및 사용법 - 기초편
[3] [R] 연산자(Operator) 종류 및 사용법 - 초급편
[4] [R] 연산자(Operator) 종류 및 사용법 - 중급편
[5] [R] 연산자(Operator) 종류 및 사용법 - 고급편