Learning & Reasoning/R

vector라 불리는 R 자료구조

이현봉 2013. 2. 6. 19:03

R에는 보통 다른 언어에 있는 " int  i = 10 " 에서 i 같은 scalar 데이터 타입이 없다.  R에서 쓰는 모든 값 또는 변수는 자료구조 (data structure) 의 특정 값이던가 또는 자료구조를 reference한다.  또한 R의 모든 자료구조는 어떤 클래스이다. 즉, R에서 모든 data type (R에서는 mode라고)은 자료구조로 되었있으며, 모든 값을 지닌 변수는 object이다.  그 중 가장 단순한 것이 vector이다.  vector는 동일한 데이터 타입으로 된 element들의 일차원 배열이다.  vector 내의 element들은 순서(index)를 갖는다. R의 index는 C/JAVA와 달리 '1' 부터 시작한다.  우리가 R에서 vector 변수를 치면 나오는 [x] 응답 prompt에서 'x' 값이 element의 벡터내의 위치를 가르킨다.

R에서 vector가 row vector인지, 아니면 column vector로 해석되는 가는 R이 그 때 그 때 상황이 따라 자동적으로 적절하게 적용하는 것 같음.  가령 matrix * vector 에서 벡터의 element 숫자가 matrix의 column 숫자와 같아야 됨으로 이 때의 vector는 column vector로 해석됨.

Again, R에서는 scalar 데이터가 없다.  또한, 변수를 만들 때 변수타입을 가르쳐주지 않는다.  따라서 한 변수는 어떤 때는 vector를 또 다른 때는 data.frame을 담을 수가 있다.  변수를 만들 때 그 타입을 명시해 주지 않으니 그 변수에 앞으로 담을 수 있는 객체 타입 또한 자유롭다는 의미이다. 어찌보면 극단적인 polymorphic 변수이다.  마찬가지로, function의 parameter에도 타입 규정이 없다.  어떻게 변수의 값을 주고 받을까?  called function이 자기가 받을 패러미터에 대해서 미리 모르니 어떻게 준비할 수 있을까?  못하지.  runtime에서야 알지.  그러면 runtime에 caller가 변수내의 값들을 value로써 전해주고, called function은 이를 copy로 받나?  객체를 reference로 주고 받지 않나?  R에서 사용하는 data.frame같은 객체들의 크기가 장난이 아닌데 만약 객체 주고 받을 때 마다 카피들이 생기면 메모리가 금방 동 날터인데, 이게 맞나?   R이 어떻게 객체들을 메모리에서 관리할 지에 대해 궁금하게 만든다.  무슨 말이 있겠지.  다음과 같이 x 에 1을 넣어보자.

> x <- 1 # R은 "strongly typed" 언어가 아니다. > x [1] 1 # x는 1개의 element만을 갖는 벡터이고, 첫번째 값이 1이다.

> v <- c(1, 2, 3)   # c는 catenate에서 나왔으며, actual parameter를 연결해 만들라는 말 
> v
[1] 1 2 3
> v <- c(v, 10:50)  # 다른 언어에서와 같이 오른쪽 expression 결과를 왼쪽에 넣음. 
> v             # 1,2,3 뒤로 10에서 50까지의 수가 연결되었음.
 [1]  1  2  3 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[26] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50   # 26번 element는 32
> v[27]         # 벡터내의 element들은 순서가 있기에 27번째의 값은 ;
[1] 33          # 여기서 [1]은 v[27]에 있는 element는 하나이고, 그 첫번째가 33이라는 말.

> length(v)
[1] 44            # v 는 44개의 element로 되었음.

> v <- c(v, "apple", "orange")  # 지금껏 숫자로 된 vector인 v에 char string 2개를 덧 붙임
> v              # 위와 같이 해도 에러가 나지 않음.  그 결과를 보니 ;
 [1] "1"      "2"      "3"      "10"     "11"     "12"     "13"     "14"    
 [9] "15"     "16"     "17"     "18"     "19"     "20"     "21"     "22"    
[17] "23"     "24"     "25"     "26"     "27"     "28"     "29"     "30"    
[25] "31"     "32"     "33"     "34"     "35"     "36"     "37"     "38"    
[33] "39"     "40"     "41"     "42"     "43"     "44"     "45"     "46"    
[41] "47"     "48"     "49"     "50"     "apple"  "orange"

전에 있던 numeric element들이 모두 char string으로 됨. vector는 모두 같은 mode의 element로 되어있어야 하기에 R이 numeric 을 string으로 자동 바꿈.

> v <- as.numeric(v[1:44])  # v 에서 "apple", "orange"를 제외하고 다시 numeric으로
> v                         # 다시 원래 숫자로 된 벡터로 돌아왔다. 
 [1]  1  2  3 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[26] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50


다양한 vector operation ;

> x <- 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10     # x는 1 부터 10으로 된 벡터
> y = 1/x                              # 벡터 x를 inverse함은 그 element를 inverse함.  
> y
 [1] 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667 0.1428571
 [8] 0.1250000 0.1111111 0.1000000
> y = x*10               # R에서 10이라는 scalar는 없음. 10은 one element 벡터. 
> y                      # 벡터 연산에서 어느 한 벡터의 element 숫자가 모자라면 다시 활용.
 [1]  10  20  30  40  50  60  70  80  90 100  # 즉 10이 다시 활용되었음.
> y = x -10    # 10이 하나 밖에 없으므로 10이 x의 element 숫자만큼 재활용 됨.
> y
 [1] -9 -8 -7 -6 -5 -4 -3 -2 -1  0

> y + c(1,2,3)    # 10개 element로 된 벡터 y에 3개 element의 벡터를 더하면
 [1] -8 -6 -4 -5 -3 -1 -2  0  2  1 # 계산은 함. (1,2,3)을 Y에 재활용하면서 순서대로 더함.
Warning message:
In y + c(1, 2, 3) :   # 게다가 뒤위 3 element 벡터가 앞의 10 element의 배수가 아니라 불평.
  longer object length is not a multiple of shorter object length 

> x
 [1]  1  2  3  4  5  6  7  8  9 10
> y
 [1] -9 -8 -7 -6 -5 -4 -3 -2 -1  0
> v
 [1]  1  2  3 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[26] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
> z <- 2*x*x + y + 1
> z
 [1]  -6   1  12  27  46  69  96 127 162 201  # 맞음.



벡터는 앞에서 본 numeric vector외에 내부 element들이 character인 character 벡터, logcial vector 등이 있다. R의 데이터 타입 설명은 R-intro에 잘 나옴.

Vectors can be used in arithmetic expressions, in which case the operations are performed element by element. Vectors occurring in the same expression need not all be of the same length. If they are not, the value of the expression is a vector with the same length as the longest vector which occurs in the expression. Shorter vectors in the expression are recycled as often as need be (perhaps fractionally) until they match the length of the longest vector. In particular a constant is simply repeated.