벡터 연산

    벡터 연산Vectorized Computation(또는 Array Programming)은 벡터 또는 리스트를 한 번에 연산하는 것을 말한다. 벡터 연산이 중요한 이유는 for 문 등을 사용해 값을 하나씩 처리해나가는 대신 벡터나 리스트를 한 번에 처리하는 것이 더 효율적이고 편리하기 때문이다. 가장 간단한 예로 다음과 같이 벡터에 저장된 값을 1씩 증가시키는 경우를 살펴보자.

    > x <- c(1, 2, 3, 4, 5)
    > x + 1
    [1] 2 3 4 5 6
    

    벡터끼리 연산하는 것도 가능하다. 앞서 ‘2.3.5 진릿값’ 절에서 설명했듯이 벡터 간 연산 시에는 &&가 아니라 &를 사용한다.

    > x <- c(1, 2, 3, 4, 5)
    > x + x
    [1] 2 4 6 8 10
    > x == x
    [1] TRUE TRUE TRUE TRUE TRUE
    > x == c(1, 2, 3, 5, 5)
    [1] TRUE TRUE TRUE FALSE TRUE
    > c(T, T, T) & c(T, F, T)
    [1] TRUE FALSE TRUE
    

    R의 함수들은 기본적으로 이러한 벡터 기반 연산을 지원한다. 예를 들어, 다음과 같이 sum( ), mean( ), median( ) 등은 벡터를 곧바로 인자로 받을 수 있다.

    > x <- c(1, 2, 3, 4, 5)
    > sum(x)
    [1] 15
    > mean(x)
    [1] 3
    > median(x)
    [1] 3
    

    ifelse( )도 한 번에 적용 가능하다. 다음은 2로 나눈 나머지를 사용해 짝수even, 홀수odd를 판별하는 예다.

    > x <- c(1, 2, 3, 4, 5)
    > ifelse(x %% 2 == 0, "even", "odd")
    [1] "odd" "even" "odd" "even" "odd"
    

    벡터 연산을 사용하면 데이터 프레임Data Frame에 저장된 데이터 중 원하는 정보를 쉽게 얻을 수 있다. 기본 원리는 데이터 프레임에 진릿값을 지정해 특정 행을 얻어올 수 있다는 점을 이용하는 것이다. 다음은 1행, 3행, 5행에 TRUE를 지정해 해당 행들만 데이터 프레임에서 가져오는 예다.

    > (d <- data.frame(x=c(1, 2, 3, 4, 5), y=c("a", "b", "c", "d", "e")))
      x y
    1 1 a
    2 2 b
    3 3 c
    4 4 d
    5 5 e
    > d[c(TRUE, FALSE, TRUE, FALSE, TRUE), ]
      x y
    1 1 a
    3 3 c
    5 5 e
    

    따라서 행의 선택 기준이 되는 TRUE, FALSE를 벡터 연산으로 만들어주면 특정 행을 선택할 수 있게 된다. 다음은 x 값이 짝수인 행만 선택한 예다.

    > d[d$x %% 2 == 0, ]
      x y
    2 2 b
    4 4 d
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.