R) 기본 1차원 벡터 - 연산

R) 기본 1차원 벡터 - 연산

R의 기본 1차원 벡터는 Python의 기본 객체인 리스트와 다르게 객체의 모든 원소에 일괄 연산이 가능하다. 물론 이것과 대응되는 Python의 객체는 NumPy라이브러리의 array가 있긴 하다. 보다 편리한 연산 기능을 지원하는 R 기본 1차원 벡터 연산을 알아보도록 하겠다.

다음 예제를 실행해보기 전에 객체를 하나 준비하자.

1
aa = 5:9

연산자

연산자는 크게 할당, 산술, 비교, 논리 연산자가 있으며 그 이외에도 다양한 연산자가 존재한다. 여기서는 연산에 직접적으로 관여하는 산술, 비교연산자를 알아보도록 하겠다.

산술 연산자

사칙연산부터 지수연산까지 다뤄보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
aa + 1 # 1
## [1] 6 7 8 9 10

aa - 1 # 2
## [1] 4 5 6 7 8

aa * 2 # 3
## [1] 10 12 14 16 18

aa / 2 # 4
## [1] 2.5 3.0 3.5 4.0 4.5

aa^2 # 5
## [1] 25 36 49 64 81

aa^0.5 # 6
## [1] 2.236068 2.449490 2.645751 2.828427 3.000000

aa ** 2 # 7
## [1] 25 36 49 64 81

1~4번 코드는 사칙연산, 5~7번 코드는 지수연산이다. R은 Python과 다르게 hat(^)과 double asterisk(**) 둘 다 지수연산에 사용가능하다. 그래서 Python 사용자라면 후자를 사용하는 것이 두 언어를 같이 운용하는데 그나마 도움이 되지 않을까 한다.

비교 연산자

이상, 이하, 초과, 미만. 우선 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
aa >= 6
## [1] FALSE TRUE TRUE TRUE TRUE

aa <= 7
## [1] TRUE TRUE TRUE FALSE FALSE

aa > 6
## [1] FALSE FALSE TRUE TRUE TRUE

aa < 7
## [1] TRUE TRUE FALSE FALSE FALSE

각 결과는 논리값인 TRUEFALSE로 나오며 어떤 원소가 조건을 만족하는지 알 수 있다. 그런데 일단 각 원소가 비교하는 원소보다 크거나 작은 것은 알겠으나 특정 조건을 만족하는 원소를 뽑으려면 어떻게 할까? 앞에서 배운 대괄호를 활용한 벡터 연산을 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
aa[aa >= 6] # 1
## [1] 6 7 8 9

aa[c(FALSE, TRUE, TRUE, TRUE, TRUE)] # 2
## [1] 6 7 8 9

aa[c(2, 3, 4, 5)] # 3
## [1] 6 7 8 9

aa[2:5] # 4
## [1] 6 7 8 9

보다시피 1~4번 코드의 결과는 완전히 같으며 실제 비교연산자 기반 필터링을 실시할 경우 1번 코드를 사용하면 된다. 보다 확실한 이해를 위해서 2~4번 코드를 추가로 작성하였으니 참고하기 바란다.

비교 연산자 중에 각 항이 같은지 다른지 확인하는 ==!= 예제는 다음과 같다.

1
2
3
4
5
aa == 7 # 1
## [1] FALSE FALSE TRUE FALSE FALSE

aa != 7 # 2
## [1] TRUE TRUE FALSE TRUE TRUE

앞에 소개한 것과 같이 필터링을 하려면 다음과 같이 작성하면 된다.

1
2
3
4
5
aa[aa == 7] # 1
## [1] 7

aa[aa != 7] # 2
## [1] 5 6 8 9

함수

산술 함수

산술함수 또한 한 번에 모든 원소에 연산을 실시할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sum(aa)
## [1] 35

min(aa)
## [1] 5

max(aa)
## [1] 9

mean(aa)
## [1] 7

abs(aa)
## [1] 5 6 7 8 9

물론 지수/로그 연산도 가능하다.

1
2
3
4
5
6
7
8
sqrt(aa)
## [1] 2.236068 2.449490 2.645751 2.828427 3.000000

exp(aa)
## [1] 148.4132 403.4288 1096.6332 2980.9580 8103.0839

log10(aa)
## [1] 0.6989700 0.7781513 0.8450980 0.9030900 0.9542425

기타 함수

기본 1차원 객체와 같이 사용하면 좋은 함수인 which(), diff(), rep() 함수를 소개한다. 먼저 which() 함수를 보겠다.

1
2
3
4
5
6
7
8
which(aa == 5) # 1
## [1] 1

which(c(TRUE, FALSE, FALSE, FALSE, FALSE)) # 2
## [1] 1

which(c(TRUE, FALSE, TRUE)) # 3
## [1] 1 3

1번 코드를 보면 which() 함수가 aa객체 내부에 ‘5’라는 원소가 어디에 있는지 알려주는 것 같지만, 정확하게는 which() 함수에 전달되는 논리값을 확인하고 그 위치를 반환하는 것이다. 2번과 3번 코드를 보면 되며 2번은 1번 코드와 쌍으로 보면 되고, 3번 코드는 2개 이상의 ‘TRUE’가 함수에 전달되었을 때 어떻게 전달되는지 확인할 수 있는 코드가 되겠다.

1
2
diff(aa) # 1
## [1] 1 1 1 1

diff() 함수는 차분(差分) 또는 계차(階差)를 구하는 함수이다. 그러니까 각 원소의 차를 구해주는 함수이며 도식화 하면 다음과 같다.

aa 객체에 `diff()` 함수 사용

이 함수는 연속적으로 기록된 데이터를 검증할 때 활용하기도 하니 참고하도록 하자.

1
2
3
4
5
rep(aa, times = 3) # 1
## [1] 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9

rep(aa, each = 3) # 2
## [1] 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9

rep() 함수는 replicate의 첫 세 글자를 딴 함수라고 보면 된다. 입력된 객체를 복제하는데 times 인자를 사용하면 객체 단위로 복제를 하고 each 인자를 사용하면 원소 단위로 복제를 한다. 이와 관련해서 순열 조합 등 다양한 함수와 기능이 있는데 이는 차후에 다루도록 하겠다.


<객체 시리즈 - 기본 1차원 벡터>
R) 기본 1차원 벡터 - 생성
R) 기본 1차원 벡터 - 조작
R) 기본 1차원 벡터 - 연산
R) 기본 1차원 벡터 - 리사이클링

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×