본문으로 바로가기



R에서의 벡터(Vector) 선언하기 3 - 필터링을 이용한 벡터 선언

category R Programming/Data handling 2017.05.29 14:34

벡터 필터링에 대하여

이제까지 우리는 R에서 벡터를 정의하는 방법에 대하여 알아봤다. 이번 포스팅에서는 이미 정의된 벡터를 가지고 노는? 방법에 대하여 알아보도록 하겠다.

x라는 이름의 벡터를 다음과 같이 미리 정의해 놓았다고 하자.

x <- c(1:10)
x
##  [1]  1  2  3  4  5  6  7  8  9 10

정의된 벡터 x의 특정 원소를 선택하고 싶은 경우, [ ] 대괄호 연산자를 사용할 수 있는데 예를 들어 x 벡터의 두번째 원소를 선택하고 싶은 경우에는 다음과 같이 입력하면 된다.

x[2]
## [1] 2

따라서, 이러한 대괄호 연산자를 이용하여 새로운 벡터를 정의할 수 도 있다. 다음의 코드는 벡터 x의 첫번째 세번째 원소만을 원소로 가지는 새로운 벡터 y를 정의하는 코드이다.

y <- x[c(1,3)]
y
## [1] 1 3

위의 코드에서 느껴?지는 것처럼 대괄호 연산자, [ ],는 필터 역할을 한다고 생각하면 좋겠다. 대괄호 안의 c()가 잘 작동하는 것처럼, 이제까지 우리가 배운 많은 연산자들 역시도 똑같이 작용한다! 몇가지 예를 보도록 하자.

벡터 필터링 응용하기

첫번째로 벡터 x의 첫번째부터 다섯번째 원소까지를 선택하여 새로운 벡터를 만들고 싶은 경우 다음과 같은 코드를 사용하여 정의 할 수 있다.

y <- x[1:5]
y
## [1] 1 2 3 4 5

두번째로, 만약 우리가 벡터 x의 세번째 원소만을 가지고 길이가 4인 벡터를 만들고 싶다면, 전 포스팅에서 공부한 rep() 명령어를 사용하면 된다.

y <- x[rep(3,4)]
y
## [1] 3 3 3 3

세번째로, R 연산이 가지는 특성을 잘 활용하면 벡터 x의 짝수번째 원소들만을 가지는 새로운 벡터 y를 다음과 같이 정의 할 수 있다.

y <- x[1:5*2]
y
## [1]  2  4  6  8 10

위의 코드를 이해하기 위해서는 먼저 대괄호 안의 연산을 이해해야 한다.

1:5 * 2
## [1]  2  4  6  8 10

위의 코드에서 알수 있는 것처럼 R에서는 벡터에 상수를 곱할 경우, 자동으로 아래와 같은 벡터의 스칼라 곱으로 이해하여 처리하는 것을 알 수있다. \[ 2a=2\times\left(\begin{array}{c} 1\\ 2\\ 3\\ 4\\ 5 \end{array}\right)=\left(\begin{array}{c} 2\\ 4\\ 6\\ 8\\ 10 \end{array}\right) \] 그러므로 위에서 사용된 코드, x[1:5*2],는 사실상 다음과 같이 벡터 y를 정의하는 코드와 동일한 것이다.

y <- x[c(2,4,6,8,10)]
y
## [1]  2  4  6  8 10

그렇다면 벡터 x의 홀수번 째 원소만을 뽑아서 벡터를 정의하려면 어떻게 해야할까? 힌트: 1만 빼면 된다.

우리가 사용한 코드를 조금만 바꿔주면, 홀수번 째 원소만을 선택하는 코드를 작성할수 있다.

x[1:5*2 - 1]
## [1] 1 3 5 7 9

바로 앞에서 사용한 코드에 1만 빼주면 되는 것인데, 이것이 왜 작동을 하는지 이해하기 위해서는 recycling 개념을 이해해야 한다. 위의 예제에서와 같이 R은 길이가 다른 벡터간 연산을 사용자가 강제로 시킬 경우에 자동으로 길이를 맞춰서 계산하도록 설계되어있다.

예를 들어, 수학적으로 아래와 같이 길이가 다른 두 벡터의 차는 정의가 되지 않는다. \[ 2\times\left(\begin{array}{c} 1\\ 2\\ 3\\ 4\\ 5 \end{array}\right)-1 \]

하지만, R에서는 위의 정의되지 않는 계산식을 아래와 같이 길이가 작은 벡터를 길이가 긴 벡터에 맞춰 늘려준 후 계산을 해주는 것이다.

\[ 2\times\left(\begin{array}{c} 1\\ 2\\ 3\\ 4\\ 5 \end{array}\right)-\left(\begin{array}{c} 1\\ 1\\ 1\\ 1\\ 1 \end{array}\right)=\left(\begin{array}{c} 1\\ 3\\ 5\\ 7\\ 9 \end{array}\right) \]

이렇듯 recycling의 개념은 예제에서의 상수 1을 길이가 5인 1벡터로 만들어 주는 ‘자동 길이 맞춤’ 개념으로 이해된다. recycling이라는 이름은 길이가 5인 1벡터를 만들기 위해서 상수 1을 다섯번 반복해서 생성하는 것처럼 보이는 것에서 온 것이라 생각하자.

SHARE TO