R의 기본 1차원 벡터는 Python의 기본 객체인 리스트와 다르게 객체의 모든 원소에 일괄 연산이 가능하다. 물론 이것과 대응되는 Python의 객체는 NumPy라이브러리의 array가 있긴 하다. 보다 편리한 연산 기능을 지원하는 R 기본 1차원 벡터 연산을 알아보도록 하겠다.
다음 예제를 실행해보기 전에 객체를 하나 준비하자.
1 | aa = 5:9 |
연산자
연산자는 크게 할당, 산술, 비교, 논리 연산자가 있으며 그 이외에도 다양한 연산자가 존재한다. 여기서는 연산에 직접적으로 관여하는 산술, 비교연산자를 알아보도록 하겠다.
산술 연산자
사칙연산부터 지수연산까지 다뤄보자.
1 | aa + 1 # 1 |
1~4번 코드는 사칙연산, 5~7번 코드는 지수연산이다. R은 Python과 다르게 hat(^)과 double asterisk(**) 둘 다 지수연산에 사용가능하다. 그래서 Python 사용자라면 후자를 사용하는 것이 두 언어를 같이 운용하는데 그나마 도움이 되지 않을까 한다.
비교 연산자
이상, 이하, 초과, 미만. 우선 다음과 같다.
1 | aa >= 6 |
각 결과는 논리값인 TRUE
와 FALSE
로 나오며 어떤 원소가 조건을 만족하는지 알 수 있다. 그런데 일단 각 원소가 비교하는 원소보다 크거나 작은 것은 알겠으나 특정 조건을 만족하는 원소를 뽑으려면 어떻게 할까? 앞에서 배운 대괄호를 활용한 벡터 연산을 하면 된다.
1 | aa[aa >= 6] # 1 |
보다시피 1~4번 코드의 결과는 완전히 같으며 실제 비교연산자 기반 필터링을 실시할 경우 1번 코드를 사용하면 된다. 보다 확실한 이해를 위해서 2~4번 코드를 추가로 작성하였으니 참고하기 바란다.
비교 연산자 중에 각 항이 같은지 다른지 확인하는 ==
와 !=
예제는 다음과 같다.
1 | aa == 7 # 1 |
앞에 소개한 것과 같이 필터링을 하려면 다음과 같이 작성하면 된다.
1 | aa[aa == 7] # 1 |
함수
산술 함수
산술함수 또한 한 번에 모든 원소에 연산을 실시할 수 있다.
1 | sum(aa) |
물론 지수/로그 연산도 가능하다.
1 | sqrt(aa) |
기타 함수
기본 1차원 객체와 같이 사용하면 좋은 함수인 which()
, diff()
, rep()
함수를 소개한다. 먼저 which()
함수를 보겠다.
1 | which(aa == 5) # 1 |
1번 코드를 보면 which()
함수가 aa
객체 내부에 ‘5’라는 원소가 어디에 있는지 알려주는 것 같지만, 정확하게는 which()
함수에 전달되는 논리값을 확인하고 그 위치를 반환하는 것이다. 2번과 3번 코드를 보면 되며 2번은 1번 코드와 쌍으로 보면 되고, 3번 코드는 2개 이상의 ‘TRUE’가 함수에 전달되었을 때 어떻게 전달되는지 확인할 수 있는 코드가 되겠다.
1 | diff(aa) # 1 |
diff()
함수는 차분(差分) 또는 계차(階差)를 구하는 함수이다. 그러니까 각 원소의 차를 구해주는 함수이며 도식화 하면 다음과 같다.
이 함수는 연속적으로 기록된 데이터를 검증할 때 활용하기도 하니 참고하도록 하자.
1 | rep(aa, times = 3) # 1 |
rep()
함수는 replicate의 첫 세 글자를 딴 함수라고 보면 된다. 입력된 객체를 복제하는데 times
인자를 사용하면 객체 단위로 복제를 하고 each
인자를 사용하면 원소 단위로 복제를 한다. 이와 관련해서 순열 조합 등 다양한 함수와 기능이 있는데 이는 차후에 다루도록 하겠다.
<객체 시리즈 - 기본 1차원 벡터>
R) 기본 1차원 벡터 - 생성
R) 기본 1차원 벡터 - 조작
R) 기본 1차원 벡터 - 연산
R) 기본 1차원 벡터 - 리사이클링