R의 장점이자 특징 중의 하나가 벡터 연산이 가능해서 프로그램을 깔끔하게 짤 수 있고 연산처리 속도가 빠르다는 점, Indexing을 활용하면 필요한 벡터 객체만 가져다가 다시 프로그램의 input으로 사용할 수 있다는 점 등에 대해 이전에 소개해준 적이 있는데요,
그럼 이번에는 벡터 끼리 혹은 벡터와 스칼라 간에 비교할 때 쓰는 비교/논리 연산자에 대해서 알아보도록 하겠습니다.
벡터의 비교/논리 연산자 |
-- 비교 연산자 --
(1) ~ 보다 크다 : >
aa, bb 라는 벡터와 cc 라는 스칼라를 만들어서 비교/논리 연산자를 실습해 보겠습니다.
> aa <- c(1, 2, 3, 4, 5, 6, 7) # 벡터 > bb <- c(7, 6, 5, 4, 3, 2, 1) # 벡터 > cc <- c(4) # 스칼라 > > aa > bb [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE > aa > cc [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE |
'>' 연산자를 실행하면 'TRUE', 'FALSE'와 같은 논리형 벡터가 아래에 출력됩니다.
'aa' 벡터는 구성요소가 7개인 반면에, 'cc' 스칼라는 구성요소가 1개 밖에 없는데도 비교 연산이 되었습니다. 이처럼 서로 구성요소의 개수가 다르면 스칼라가 R 내부적으로 7번 반복이 되어서 순환연산이 실행되었습니다. 벡터끼리 연산할 때도 서로 개수가 다르면 개수가 작은 쪽이 순환연산이 이루어져서 서로 짝을 맞추어서 연산이 실행됩니다.
(2) ~ 보다 크거나 같다 : >=
> aa >= bb [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE > aa >= cc [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE |
(3) ~ 보다 작다 : <
> aa < bb [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE > aa < cc [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE |
(4) ~ 보다 작거나 같다 : <=
> aa <= bb [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE > aa <= cc [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE > aa =< cc Error: unexpected '<' in "aa =<" |
세번째 명령어에 보면 부호의 순서가 '=<' 처럼 '~보다 같거나 작다'의 순서로 했더니 에러가 났습니다. '<=' 처럼 '~보다 작거나 같다'의 순서로 부호 사용하기 바랍니다.
(5) 서로 같다 : ==
> aa == bb [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE > aa == cc [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE |
R에서 객체를 할당할 때 '<-' 또는 '=' 를 사용하는데요, 비교 연산자의 '==' 과 헷갈리지 않도록 합니다.
(6) 서로 같지 않다 : !=
> aa != bb [1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE > aa != cc [1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE > aa =! cc > |
서로 같지 않다도 부호의 순서를 '!=' 로 해야지만 논리형 벡터가 결과 값으로 나옵니다. 세번째 줄처럼 '=!'로 하면 논리형 벡터 결과가 안나오니 순서 주의하세요.
-- 논리 연산자 --
(7) 동시에 조건 만족 (aa AND bb) : aa & bb
> aa > 3 & aa < 6 [1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE > aa >= 3 & aa <= 6 [1] FALSE FALSE TRUE TRUE TRUE TRUE FALSE |
(8) 또는 조건 만족 (aa OR bb) : aa | bb
> aa < 3 | aa > 6 [1] TRUE TRUE FALSE FALSE FALSE FALSE TRUE > aa <= 3 | aa >= 6 [1] TRUE TRUE TRUE FALSE FALSE TRUE TRUE |
-- 논리 연산자에 대한 추가 연산 --
(9) 조건 만족하는 논리형 벡터에 대한 합계, 평균 : sum(), mean()
> sum(aa > 3 & aa < 6) [1] 2 > sum(aa < 3 | aa > 6) [1] 3 > mean(aa > 3 & aa < 6) [1] 0.2857143 > mean(aa < 3 | aa > 6) [1] 0.4285714 |
R은 'TRUE'는 '1'로, 'FALSE'는 '0'으로 내부적으로 인식합니다. 따라서 sum()이나 mean() 과 같은 숫자형 벡터에 대한 통계 함수를 사용할 수가 있습니다.
(10) 비교/논리 연산 결과에 대해 하나라도 (any) 혹은 전부(all) TRUE 가 있는지 여부 확인 : any(), all()
> any(aa > 3 & aa < 6) [1] TRUE > all(aa > 3 & aa < 6) [1] FALSE > any(aa > 8) [1] FALSE > any(aa == 1) [1] TRUE > all(aa == 1) [1] FALSE |
위의 (1) ~ (9)번까지의 예들이 1~7까지의 혹은 7~1까지의 몇 개 안되는 구성요소를 가지고 예를 들다보니 눈으로 보면 TRUE가 뭐고 몇 개인지 바로 알 수 있지만요, 실제 분석할 때는 많은 경우 관측치 수가 수 만개, 수 백만개, 수 천만개가 되는 경우가 많습니다. 그때 일일이 육안으로 TRUE, FALSE를 확인한다는 것은 사실상 불가능합니다. 따라서 비교/논리 연산 결과에 대해 sum(), mean(), any(), all() 등과 같은 함수를 적절히 활용해서 즉시 데이터 셋에 대한 상황 파악(탐색)을 하는 것이 필요합니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^