두 벡터가 동일한지 비교하는 간단한 팁입니다.
R은 벡터(vector)와 스칼라(scala)의 구분이 없이 사실은 모든 변수를 벡터로 취급하기 때문에 다른 언어에는 없는 몇 가지 문제가 생깁니다. 이것도 그것과 관련이 있습니다.
두 벡터, 즉 2개의 변수가 있고 변수가 모두 length가 2 이상일 때 두 벡터가 완전히 동일한지 비교할 때 아래의 코드에서 첫번째 if구문과 같은 실수를 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
v1 <- c(1, 2, 3) v2 <- c(1, 2, 4) if (v1 == v2) { print("same") } else { print("not same") } if (all.equal(v1, v2) == TRUE) { print("realy same") } else { print("realy not same") } |
위의 예제 코드에서 첫번째 if 구문은 상식적으로 의도한 대로 작동하지 않습니다. == 연산자가 두 변수의 첫번째 요소(first element)만을 비교하기 때문에 두 벡터가 같다고 나옵니다.
물론 다음과 같은 경고 메세지를 콘솔창에 뿌려주기 때문에 문제가 있다는 것을 알 수는 있습니다. 무심결에 경고메세지를 무시해 버리면 큰 문제가 생길 수 있습니다.
1 2 3 4 5 |
Warning message: In if (v1 == v2) { : the condition has length > 1 and only the first element will be used |
만약 두 벡터의 멤버가 모두 동일한지 비교하려면 처음 코드에서 두 번째 사용한 if 구문처럼 all.equal을 사용해야 합니다.
1 2 3 |
all.equal(v1, v2) == TRUE |
코드를 조금 고쳐서 다음과 같은 것을 실행해 보세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
v1 <- c(1,2,3) v2 <- c(1,2,4) v3 <- c(1,2,3) if (v1 == v2 & v1 == v2) { print("same") } else { print("not same") } if (all.equal(v1, v2) == TRUE & all.equal(v1, v3)) { print("realy same") } else { print("realy not same") } all.equal(v1, v2) == TRUE all.equal(v1, v3) == TRUE |
사실 R을 사용해서 작업을 할 때 두 벡터가 완전히 동일한지 비교할 일이 별로 없습니다. 그래서 새까맣게 까먹고 있다고 가끔 실수를 저지를 때가 있습니다.