R 예제: 1이 연속으로 나오는 부분 찾기

|



R을 어떻게 하면 쉽게 이해할 수 있을까? 생각해봤습니다. 

모든 프로그래밍 언어가 마찬가지겠지만 실제 적용하는 사례로 보는 것이 가장 좋은 방법이 아닐까 합니다. 

그래서 지금부터 R에 대해서 "빅데이터 분석 도구 R 프로그래밍(노만 매트로프 지음)"의 예제로 정리해 보려고 합니다. 



첫번째는 매우 쉬운 예제이기는 하지만 기본적인 R을 이해하는데 도움이 될 것 같아서 진행해 봅니다. 

0과 1로만 이루어진 벡터가 있을 때, 1이 연속으로 나오는 부분을 찾는 함수입니다. 

즉, (1,0,0,1,1,1,0,1,1)과 같은 벡터가 있을 때, 1이 연속으로 세번 나오는 곳을 찾으면 4가 되겠죠..


중요한 부분이 R에서의 벡터는 1부터 시작한다는 점입니다. 

C/C++에 익숙했던 분들은 0부터 시작한다고 생각할 수도 있지만, R은 1부터 시작하는 점을 꼭 기억해 두세요. 


위 숫자에서 1이 연속으로 두번 나오는 곳을 찾으면, 4, 5, 8이 되겠죠.. 

자 그럼.. 이런 계산을 R로 어떻게 구성할까요? 



소스를 보면 정말 간단해 보입니다. 

하나씩 살펴보도록 하죠.. 


첫번째 줄은 findruns라는 함수를 정의한 것입니다. 

매개변수로 벡터 x와 1이 연속으로 나오는 개수를 지정한 k를 받고 있지요. 


이어서 벡터 x의 길이를 구해서 n에 할당하게 됩니다. 

for 문에서 runs라는 결과값을 생성할 때 기존의 runs에 새로운 것을 추가하는 형태이기 때문에, 

runs라는 벡터를 선언을 해야 합니다. 

R에서는 별도의 선언문이 없으므로 NULL을 할당해서 for 문에서 runs를 재할당 할 수 있도록 했습니다. 


for 문을 살펴보면 i in 1:(n-k+1) 이 나오는데요. 

i가 1부터 시작해서 (n-k+1)까지 반복문을 실행하라는 것입니다. 

n이 9이고 k가 3이라고 가정하면, 마지막 8,9번째 숫자는 계산할 필요가 없습니다. 

왜냐하면 이후에 남은 개수가 3개가 안되므로 당연히 1이 연속으로 3개 나올 수 없기 때문이죠.. 

그래서 (n-k+1)까지만 계산하도록 하는 것입니다. 


if 문을 살펴보도록 하지요. 

all(x[i:(i+k-1)]==1)) 을 먼저 보면, i부터 k개만큼 1이 나오는지 확인하는 것입니다. 

그런데, all()이라는 함수를 사용했습니다. 

R은 벡터 기반이므로 all(...)은 내용이 모두 TRUE일때, TRUE를 리턴합니다. 

즉, K가 3이라고 하고, all(x[1:3]==1)을 확인하면 TRUE, FALSE, FALSE 이렇게 나오므로 결과는 FALSE가 되는 것이죠. 


마지막으로 k개가 모두 1일 경우에, runs에 이전 runs와 현재 i를 추가해서 재할당 해줍니다. 

결과는 다음과 같이 나타납니다. 



하지만 위 예제에서 성능을 향상시킬 수 있는 부분이 있습니다. 

runs <- c(runs, i)로 계속 재할당을 하고 있는데요. 

이 부분을 미리 runs에 메모리 공간을 할당하고 값을 넣은 다음, 나머지 필요 없는 부분을 잘라내는 형태로 구성하면 성능 향상이 됩니다. 



소스는 좀 더 복잡해지지만 runs의 할당이 두번만 일어나므로 보다 효율적이겠지요. 

앞서 설명한 내용을 기반으로 살펴보면 이해가 될 것입니다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0