2016. 10. 17. 16:00

제가 기초설명은 잘 안 하는데 R언어는 일반적인 언어와 다른 특성이 좀 있어서 간단하게 설명을 하겠습니다.

 

1. 데이터

R언어에서 모든 데이터를 배열에 넣습니다.

 

R스튜디오(RStudio)를 열고 콘솔에 다음 코드를 넣어 봅시다.

1
2
3
4
5
6
> 1 + 1
[1] 2
 
> 100:130
[1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
[19] 118 119 120 121 122 123 124 125 126 127 128 129 130
cs

 

첫 번째 코드는 '1 + 1'의 결과가 배열에 1번에 들어갔다는 것입니다.

두 번째 코드는 100~130까지 들어있는 배열을 만들었다는 것입니다.

 

두 번째 코드처럼 순차적인 처리를 할 때는 콜론(:)을 사용합니다.

 

2. 객체

일반적인 언어에서 사용하는 변수는 R언어에서는 객체라고 부릅니다.

자바스크립트와 같은 인터프리터(interpreter)언어들이 변수를 오브젝트(object)취급 하는 것과 같습니다.

 

사용방법은 객체 이름을 만들고 '<-'를 넣어서 객체에 값을 할당하는 것입니다.

1
2
3
4
5
#a에 '1'을 넣는다.
> a <- 1
#a의 내용을 출력 한다.
> a
[1] 1
cs

 

객체를 이용하여 계산도 가능합니다.

1
2
3
4
5
6
> a + 2
[1] 3
 
> b <- 2
> a + b
[1] 3
cs

 

R스튜디오를 사용 중이라면 환경(Environment)창에서 생성한 객체를 확인할 수 있습니다.

 

'ls()'함수로 확인할 수 있습니다.

 

객체의 이름은 대소문자를 가립니다.

그 외에 룰은 일반적인 언어들과 같습니다.

1
2
3
> ls()
[1"a"     "b"     "roll2" "roll3" "rolls" "x"    
[7"y"    
cs

 

사용 중인 변수에 값을 다시 넣으면 그냥 덮어씌우게 됩니다.

변수 취급하기 때문이죠 ㅎㅎㅎ

 

배열도 넣을 수 있습니다.

1
2
3
> die <- 1:6
> die
[11 2 3 4 5 6
cs

 

3. 반복 처리

R언어가 데이터를 배열 취급하기 때문에 여러 가지 장점이 있는데 그중 하나가 반복처리가 쉬워진다는 것입니다.

 

위에서 만든 'die'에 '- 1'을 해보겠습니다.

1
2
> die - 1
[10 1 2 3 4 5
cs

 

배열의 모든 값이 '- 1'되었습니다.

이것은 배열과 배열을 계산할 때도 적용됩니다.

 

1
2
> die + die
[1]  2  4  6  8 10 12
cs

 

하지만 주의해야 할 것이 배열의 길이가 다르다면 짧은 쪽이 반복된다는 것입니다.

1
2
> die + 1:2
[12 4 4 6 6 8
cs

 

만약 배열의 길이가 배수 관계에 없다면 에러가 납니다.

1
2
3
4
5
> die + 1:4
[12 4 6 8 6 8
Warning message:
In die + 1:4 :
  longer object length is not a multiple of shorter object length
cs

 

행렬(matrix)계산도 가능합니다.

%*% : 내적

%o% : 외적

t() : 전치

det() : 행렬식

 

1
2
3
4
5
6
7
8
9
10
11
> die %*% die
     [,1]
[1,]   91
> die %o% die
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    2    4    6    8   10   12
[3,]    3    6    9   12   15   18
[4,]    4    8   12   16   20   24
[5,]    5   10   15   20   25   30
[6,]    6   12   18   24   30   36
cs

 

4. 난수 구하기

데이터를 배열 취급하니 난수도 지정된 배열에서 랜덤한 위치의 값을 추출하는 식으로 처리하게 됩니다.

'sample([객체], [추출 갯수])'를 이용하여 추출할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
> sample(1:103)
[11 6 8
> sample(1:103)
[110  6  9
> sample(1:103)
[14 9 1
> sample(1:102)
[13 8
> sample(1:102)
[1]  5 10
> sample(1:102)
[15 6
cs

 

4-2. 겹치는 난수 구하기

난수를 구하는 'sample()'는 재미있는 특성이 있는데 겹치지 않는 배열을 추출한다는 것입니다.

그래서 겹치지 않은 값으로 만들어진 배열은 같은 값이 나오지 않습니다.

 

겹쳐도 되는 배열을 추출하고 싶다면 매개변수 'replace'를 추가하면 됩니다.

1
2
> sample(x = 1:10, size = 5, replace = TRUE)
[17 7 4 7 2
cs

 

5. 함수 사용하기

R언에서 함수에 넣는 매개변수는 일반적인 언어들처럼 넣어도 됩니다.

'4번'에서 일반적인 함수처럼 사용했죠.

 

하!지!만!

매개 변수명을 명시해서 사용하는 것이 가능합니다.

1
2
3
4
> sample(x = 1:10, size = 2)
[110  5
> round(x = 3.1415, digits = 2)
[13.14
cs

 

이렇게 말이죠.

 

R스튜디오를 사용 중이라면 함수명을 적으면 인텔리전스로 매개변수가 표시됩니다.

 

'args([함수명])'를 이용하여 확인할 수도 있습니다.

1
2
> args(round)
function (x, digits = 0
cs

 

인수명만 일치한다면 순서는 상관없습니다.

1
2
> round(digits = 2, x = 3.1415)
[13.14
cs

 

6. 함수 만들기

일반적인 언어처럼 함수를 만들어 동작을 객체화할 수 있습니다.

 

함수를 만들려면

[함수 이름] <- function([매개변수1], [매개변수2] ... [매개변수n] ) { [함수 내용] }

이런 구조로 만들 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
#함수 만들기
> roll <- function(size) {
+ die <- 1:6
+ dice <- sample(die, size = size, replace = TRUE)
+ dice }
 
#만든 함수 호출하기
> roll(3)
[11 5 1
#만든 함수 호출하기
> roll(5)
[11 3 3 6 2
cs

 

함수가 리턴값을 가지려면 리턴값을 줄 수 있는 동작을 해야 합니다.

(위의 예제에서는 'dice'에 넣은 값을 리턴합니다.)

 

매개변수를 생략했을 때 기본값을 넣어주고 싶다면 매개변수에 기본값을 지정하면 됩니다.

1
2
3
4
5
6
7
8
9
10
> roll <- function(size = 3) {
+ die <- 1:6
+ dice <- sample(die, size = size, replace = TRUE)
+ dice }
 
#함수 
> roll()
[11 3 5
> roll()
[14 4 6
cs

 

7. 스크립트 만들기

'6번'을 따라 함수를 만들다 보면 수정하기가 힘들다는 것을 느꼈을 겁니다.

그래서 함수를 만들 때는 스크립트로 작성을 해두어야 관리가 편합니다.

 

File > New File > R Script

를 선택해서 새 스크립트 창을 열어 줍니다.

 

 

 

스크립트 창에서 'Run'을 누르면 스크립트를 콘솔에 복사해서 실행하는 동작을 합니다.

 

 

'Source'버튼으로 스크립트를 실행해 볼 수 있는데 그 전에 저장을 해야 합니다.

저장이나 불러올 때 한글 경로가 있으면 에러가 나므로 한글 경로가 없이 저장합시다.

'Source' 패키지 만들 때 쓰인다는데 저도 아직 어떻게 쓰는 건지 모르겠습니다.

 

마무리

간단하게 R언어를 사용하는 방법을 정리해 봤습니다.

뭔가 일반적인 프로그래밍 언어와 인터프린터 언어의 특성이 뒤엉켜 있으면서도 행렬처리에 특화되어 있다는 느낌을 많이 받는 언어입니다.

어찌 됐건 이 정도만 알아도 기본적인 기능은 다 쓸 줄 아는 것입니다 ㅎㅎㅎㅎ