[03-3] R언어 - vector 의 상세

Language/R 2017.11.08 13:55 posted by TechNote.kr


R언어의 기본이 되는 object의 종류는 다음과 같다..



본 글에서는 vector의 사용에 대해 설명한다.


  1. vector의 기본
  2. vector에의 접근
  3. vector에 데이터 입력
    1. 순차적인 값 입력
    2. 반복적인 값 입력
  4. vector를 이용한 계산
  5. vector의 element들에 대한 naming
  6. 조건에 기반한 vector의 element 추출


1. vector의 기본


vector를 한마디로 정의하면 

동일 objects의 집합 

(같은 mode인 데이터의 1차원 나열)

라고 할 수 있다. 


완전히 똑같지는 않지만 C언어의 배열과 유사하고, 다른 matrix나 data frame을 만들 때 필요한 기본형이라고 보면 이해가 쉽다.


> sample = c(10, 20, 30, 40, 50)
> sample_text = c("a", "b", "c")
> sample_bool = c(TRUE, FALSE, TRUE)



앞의 예에서 c function는 concatenate의 줄임으로 데이터를 연속적으로 나열한다. 

다만, 동일 data type 의 값만 vector로 만들 수 있다. 


> sample_mixed = c(1, "TEST", TRUE)
> sample_mixed
[1] "1"    "TEST" "TRUE"



위의 예를 보면 number, character, logical 로 다양한 mode의 data를 이용해 vector를 구성하였지만, 결국은 character mode로 vector가 구성되었음을 알 수 있다. 




2. vector에의 접근


C언어의 배열과 마찬가지로 index로 접근이 가능하다. 다만 C언어는 index가 0부터 시작하는 반면, R언어의 vector는 1부터 시작한다. 

index가 0이 입력되면 무시된다. 


> sample[0]
numeric(0)
> sample[1]
[1] 10
> sample[2]
[1] 20
> sample[3]
[1] 30
> sample[5]
[1] 50



C언어와는 달리 여러개의 인덱스에 한번에 접근도 가능하다.


> sample[c(1,3,5)]
[1] 10 30 50



특정 인덱스만 제외하고 접근도 가능하다.


> sample[-c(2,4)]
[1] 10 30 50




3. vector에 데이터 입력


앞서 보였던 vector의 예들은 c function를 이용해서 하나씩 값을 입력하는 방식이었다. 

미리 정해져 있는 숫자들의 경우 이렇게 하나씩 입력해주어야 겠지만 반복되거나 순차적인 숫자들의 입력 같은 경우 다소 번거러울수도 있다. 이에 R언어에서는 순차적인 값을 입력하는 다양한 방법들을 제공하고 있다. 


3.1. 순차적인 값 입력


-. colon operator

-. seq function 


colon operator 의 예)

> x = 1:20
> x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20



seq function 의 예)

> y = seq(from=1,to=20)
> y
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20


seq function도 colon operator와 마찬가지로 미리 입력한 시작 숫자 부터 끝 숫자까지 순차적으로 증가하며 vector 형식으로 변수에 입력된다.


하지만 하나 다른 점이 있는데 colon operator 와는 달리 입력값의 간격을 정할 수도 있다. 


> z = seq(from=1,to=20,by=2)
> z
 [1]  1  3  5  7  9 11 13 15 17 19



좀 더 advanced한 증가하는 숫자 입력이 필요하다면 seq function을 이용하면 된다.



3.2. 반복적인 값 입력


-. rep function

-. colon operator, c function, rep function의 조합


rep function 의 예)

> x = rep(1,5)
> x
[1] 1 1 1 1 1


colon operator, c function, rep function의 조합의 예)

예1)

> y = 1:3
> z = rep(y,3)
> z
[1] 1 2 3 1 2 3 1 2 3

예2)

> z = rep(1:3,c(1,2,3))
> z
[1] 1 2 2 3 3 3




4. vector를 이용한 계산


기존 언어에서의 배열과 R에서의 vector의 가장 큰 차이점 중 하나는 연산을 위해 loop를 돌릴 필요가 없다는 점이다. 기존에는 루프를 통해 배열의 각 element에 접근하여 연산하였는데 vector는 그냥 바로 연산을 하면된다.


> a = c(1,2,3,4)
> b = c(4,3,2,1)
> c = a + b
> c
[1] 5 5 5 5



위의 예와 같이 vector는 그냥 vector 끼리 바로 연산을 하면 된다.


> a = c(1,2,3,4)
> b = c(2,1)
> c = a + b
> c
[1] 3 3 5 5



꼭 vector의 크기가 같지 않더라도 연산식 내 vector들이 가장 작은 vector의 배수이기만 하면 반복적으로 계산한다.


> a = c(1,2,3,4)
> b = c(1,2,3)
> c = a + b
Warning message:
In a + b : longer object length is not a multiple of shorter object length
> c
[1] 2 4 6 5



다만, 배수가 아닐 경우 위와 같이 계산이 되기는 하지만 warning이 발생한다.




5. vectorelement들에 대한 naming


예1)

> fruit = c(APPLE=3, BANANA=5, MELON=2)
> fruit
 APPLE BANANA  MELON 
     3      5      2



예2)  

> fruit = c(3,5,2)
> fruit
[1] 3 5 2
> names(fruit) = c('APPLE','BANANA','MELON')
> fruit
 APPLE BANANA  MELON 
     3      5      2



위와 같이 vector를 사용할 때 각 element에 이름을 붙일 수 있다. 

이렇게 붙인 이름을 통해서 바로 해당 vector의 element에 접근할 수 있다. 


> fruit[2]
BANANA 
     5 
> fruit['BANANA']
BANANA 
     5





6. 조건에 기반한 vectorelement 추출


> fruit = c(APPLE=3, BANANA=5, MELON=2, GRAPE=8, PEAR=6)
> fruit[fruit>4]
BANANA  GRAPE   PEAR 
     5      8      6 



위의 예는 4이상의 값을 가진 element 만 추출해 내는 코드이다. 

> fruit>4
 APPLE BANANA  MELON  GRAPE   PEAR 
 FALSE   TRUE  FALSE   TRUE   TRUE 



단순히 조건만 입력해 보면 각 element에 대해서 해당 조건의 logical 값이 나오는 것을 볼 수 있다. 

 

> sum(fruit>4)
[1] 3



조건에 적합한 element의 갯수를 세기 위해서는 sum을 이용한다. TRUE 인 경우는 1, FALSE인 경우는 0으로 해서 모두 더한다. 


> max(fruit)
[1] 8
> min(fruit)
[1] 2



가장 크고, 작은 element값을 구하기 위해서는 min, max function을 이용하면 된다.


> fruit[fruit==max(fruit)]
GRAPE 
    8 
> fruit[fruit==min(fruit)]
MELON 
    2 



min, max function을 이용해 구한 값과 '==' 조건을 이용해 다시한번 vector내에서 해당 element의 name과 값을 다시 한번 구할 수도 있다. 

> which(fruit==max(fruit))
GRAPE 
    4 
> which(fruit==min(fruit))
MELON 
    3



단순히 index 값만 알아내기 위해서는 which function을 이용하면 된다.

> which.max(fruit)
GRAPE 
    4 
> which.min(fruit)
MELON 
    3 


which에 조건을 주어서 구해도 되지만 바로 min, max function을 붙여서 사용해도 동일하게 index 를 구할 수 있다.