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 <- c(1, 2, 3, 4, 5, 6, 7) # 벡터 > bb <- c(7, 6, 5, 4, 3, 2, 1) # 벡터 > cc <- c(4) # 스칼라

>

> 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() 등과 같은 함수를 적절히 활용해서 즉시 데이터 셋에 대한 상황 파악(탐색)을 하는 것이 필요합니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

728x90
반응형
Posted by Rfriend
,