2012년 10월 31일 수요일

[R-project] rep() 함수 활용

KOBIC이 주최하는 제12차 차세대 생명정보학 교육에 참석 중이다. 김상철 박사가 강의하는 R 강좌를 올해 들어 두번째 듣고 있다. 자기의 데이터를 가지고 실제 코딩을 해 봐야 실력이 늘 텐데, 게으름에 차일피일 미루다 보니 좀처럼 잘 되지 않는다.

아직도 R의 기본적인 문법을 가지고 헤매는 상태이다. Perl과 달리 R은 기본적으로 벡터 형태의 데이터를 다루고 있어서 Perl처럼 반복문을 많이 쓰지 않아도 된다. 그러려면 rep() 함수를 잘 이해해야 하는데, 이것이 생초보자에게 첫번째 좌절을 안겨주는 관문이 된다. 이건 지극히 개인적인 경험이므로 다른 사람은 어떤지 모르겠다.

이 포스팅은 내 기억을 정리하기 위한 것이지 일반적인 R의 강좌를 쓰고자 함이 아니니 혹시 그런 이유로 이 블로그에 들르신 분은 과감히 [뒤로가기] 버튼을 눌러 주시길...

 아주 간단한 rep()의 예제를 보자.


> rep("A", 4)
[1] "A" "A" "A" "A"

앞의 인수로 주어진 데이터를 뒤의 인수에서 지정한 회수만큼 단순히 반복하는 것이다. 만약 반복하고자 하는 인수가 벡터라면 어떻게 될까?

> x=("A", "B", "C")
> rep(x, 3)
[1] "A" "B" "C" "A" "B" "C" "A" "B" "C"


전체 엘리먼트에 대해서 두번째 인수만큼 반복하는 것이다.

그럼 이번에는 좀 더 복잡한 사례를 들어 보겠다. 1 1 1 1 2 2 2 2 3 3 3 3을 출력하고 싶다면?


> rep(c(1, 2, 3), c(4, 4, 4))
[1] 1 1 1 2 2 2 3 3 3

또는 다음과 같이 두번째 인수를 간략하게 표현할 수도 있다.


> rep(1:3, rep(4,3))
 [1] 1 1 1 1 2 2 2 2 3 3 3 3



이상은 두번째 인수도 벡터로 주어지는 경우이다. 두 인수는 각각 벡터이고, length가 같아야 한다. 첫번째 인수 벡터의 각 원소에 대하여 반복하는 회수를 두번째 벡터에서 결정하는 것이다. 조금 더 복잡한 사례를 들어 보자. 1 2  2 3 3 3 4 4 4 5 5 5 5 5은 다음과 같이 표현 가능하다.

> rep(1:5, 1:5)
 [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

이제야 조금 알겠다...


댓글 없음: