본문 바로가기
R

[R.아르] R에서 엑셀의 vlookup() 기능 사용하기

by LightBlogger 2016. 9. 8.

vlookup이라 함은 자고로



레퍼런스에서 맞는 자료를 찾아 그 값을 반환해 주는 것이다.



R에도 엑셀의 vlookup() 같은 함수가 있다.


다음과 같은 두 개의 데이터프레임이 있다고 하자.



우리는 y를 레퍼런스로 삼아 x의 각 name에 해당하는 값을 찾아 줄 것이다.


해당 역할을 하는 함수는 merge()로, merge(자료1, 자료2, 기준) 과 같이 쓴다.



쨘! 간단하다.


vlookup()에는 안에 자료를 지정하는 순서가 중요하지만 merge()에는 순서가 중요하지 않다.


x와 y의 순서를 바꾸어도 결과는 마찬가지다.



R은 두 개의 자료를 비교하고, 값이 있는 경우 값을 모두 반환하고 값이 없는 경우에는 결과를 생략한다. 


예를들어



위와 같은 x, y에 merge()를 사용하면



이와 같은 결과가 나온다. "name'열에서 서로 공통된 것만 표기된 것을 볼 수 있다.


서로 공통되지 않은 것도, 즉 할당된 값이 없더라도 그대로 출력되기를 원하면 


all=TRUE 라는 옵션을 추가하면 된다.



값이 없는 a를 값 없음(NA)으로 표시하였다. 


그런데 d도 생겼다...?


사실 merge()는 기본적으로 두 데이터프레임을 합치는 기능이므로, vlookup()과 정확히 동일하지는 않다.


vlookup() 과 결과를 동일하게 하려면 그냥 '모두'가 아니라 'x에 있는 항목은 모두' 남기라고 해야 옳다.



이렇게 all.x=TRUE 로 'x에 있는 것 모두'를 지정해 주면 원하는 결과가 나온다.



또 하나 vlookup과 다른 점은 중복 자료가 있을 경우다.


엑셀의 경우 레퍼런스에 중복이 있을 경우 무조건 가장 첫 번째에 있는 자료를 반환한다.



E = 10 이나 B = 7 같은 자료는 반환되지 않는다는 의미다.


하지만 R에서는 다음과 같이 중복 자료를 모두 반환한다.



앞서 이야기한대로 R에는 '데이터'나 '레퍼런스'라는 순서가 없다.


두 데이터프레임을 비교하여 일치하는 결과를 모두 반환하게 되므로 


vlookup()과 동일한 결과를 원한다면 레퍼런스로 쓸 부분은 미리 중복을 제거해 놓자.



마지막으로, vlookup() 이라면 원하는 열의 값만 반환할 수도 있어야 할 것이다. 


예를들면,



위와 같은 경우 value1말고 value2를 반환하도록.


위와 같은 결과를 위해서는 열을 직접 지정해 주면 된다.


다음과 같은 x, y가 있다고 하자.



다음과 같이 y의 열을 지정하면 된다.





반응형

댓글