더북(TheBook)

벡터 연산

벡터 연산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
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.