벡터 연산
벡터 연산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