[03-1] R언어 - Object의 정의 및 종류

Language/R 2017.11.10 18:16 posted by TechNote.kr


  1. object의 종류
  2. vector
  3. matrix
  4. array

R언어에서 생성하고 다루는 개체를 objects라고 한다. 

번역시 오역이 있을 수 있어 manual 상에 적힌 영문을 기술하면 다음과 같다.


The entities that R creates and manipulates are known as objects.


R언어에 있어 가장 기본이 되는 단위(?)로 해당 object는 변수(variables), 숫자 배열(arrays of numbers), 문자열(character strings), 함수(functions) 등으로 구분될 수 있다. 


현재 R console 상 정의되어 있는 objects의 목록을 보려면 ls() 혹은 objects()를 입력하면 되는데 아래와 같이 변수, 숫자배열, 문자열, 함수 등을 선언하고 ls()하면 해당 objects들이 선언된 것을 확인할 수 있다. 


> a = 1
> b = 1:10
> c = "STRINGS"
> d = function(x) x*2
> ls()
[1] "a" "b" "c" "d"
> objects()
[1] "a" "b" "c" "d"


rm function을 사용하면 아래와 같이 objects를 삭제할 수 있다. 


> rm(a,b,c,d)
> ls()
character(0)




1. object의 종류


위와 같이 R언어에서 기본적인 단위가 objects인데 이를 좀 더 세분화하면 다음과 같다.


  • vector
  • matrix
  • array
  • factor
  • list
  • data frame
  • function


각 object 의 간략한 사용법과 서로의 차이점에 대해서 알아보면 다음과 같다. 



2. vector


"vector는 같은 mode의 element를 나열"한 것이라고 정의할 수 있다. 이를 선언하기 위한 다양한 방법이 있지만 대표적인 colon operator 를 이용한 방법을 보면 다음과 같다. 


> v1 = 1:10
> v1
 [1]  1  2  3  4  5  6  7  8  9 10
> is.vector(v1)
[1] TRUE

 

값의 나열인 vector는 그 자체로 사용되기도 하지만 앞으로 설명할 matrix, array 등 또 다른 종류의 object를 만들기 위한 기본 값으로 사용되기도 한다. 자세한 vector의 사용은 [R언어 vector의 상세] 에서 확인할 수 있다. 




3. matrix


matrix는 1차원인 vector와 달리 행과 열을 가지고 있는 2차원 구조이다. 


> m1 = matrix(1:9, ncol=3)
> m1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> is.matrix(m1)
[1] TRUE


1:9와 같이 colon operator를 이용하여 vector를 만들고 matrix function의 첫번째 argument로 입력한다. 그리고 ncol argument를 이용하여 column의 갯수를 정의하여 앞서 입력한 vector를 column 갯수만큼 잘라 row를 추가한다.  즉, 이와 같이 matrix function을 이용하여 2차원 구조의 matrix object를 만들 수 있다. matrix 를 이용하여 다양한 행열 관련 연산이 가능하다. 자세한 matrix의 사용은 [R언어 matrix의 상세]에서 확인할 수 있다. 




4. array


array는 단어 그대로 일련의 element 나열을 묶은 것이다. 그 방식에 따라 1차원 array, 2차원 array, 다차원 array를 정의할 수 있다. 그 예를 보면 다음과 같다. 


1차원 배열의 예)

> a1 = array(1:2, dim=c(2))
> a1
[1] 1 2


2차원 배열의 예) 

> a2 = array(1:4, dim=c(2,2))
> a2
     [,1] [,2]
[1,]    1    3
[2,]    2    4

 

3차원 배열의 예) 

> a3 = array(1:8, dim=c(2,2,2))
> a3
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8


앞서 설명한 vector와 matrix로 인해 array 부분이 다소 혼동스러울 수 있다. 

vector의 경우는 1차원 배열과 유사하고, matrix의 경우 2차원 배열과 유사하기 때문이다. 

그 차이를 알아보면 다음과 같다. 


우선 vector의 예와 1차원 배열의 예를 살펴보자.


vector의 예)

> v1 = 1:10
> v1
 [1]  1  2  3  4  5  6  7  8  9 10
> is.vector(v1)
[1] TRUE
> attributes(v1)
NULL


1차원 배열의 예)

> v2 = array(1:10,dim=c(10))
> v2
 [1]  1  2  3  4  5  6  7  8  9 10
> is.vector(v2)
[1] FALSE
> attributes(v2)
$dim
[1] 10


위와 같이 vector건 1차원 배열이건 그 값 자체를 출력 했을 때는 동일한 값을 출력한다. 

하지만 is.vector function을 통해 vector 여부를 확인해 보면 1차원 배열의 경우 FALSE를 return하게 된다. 배열은 차원과 상관없이 dim(dimensional) attribute를 가지고 있는데 이 attribute 존재 여부로 인해 vector와 1차원 배열에 차이가 발생하게 된다. 앞에서 언급한 것과 같이, vector는 배열을 만들기 위한 입력값으로 사용된다. 


그렇다면 matrix와 2차원 배열에는 어떤 차이가 있는지 알아보자

matrix의 예와 2차원 배열의 예를 살펴보자.


matrix의 예)

> m1 = matrix(1:9, ncol=3)
> m1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> is.matrix(m1)
[1] TRUE
> attributes(m1)
$dim
[1] 3 3


2차원 배열의 예)

> m2 = array(1:9,dim=c(3,3))
> m2
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> is.matrix(m2)
[1] TRUE
> attributes(m2)
$dim
[1] 3 3


위에서 볼 수 있듯이 vector의 경우와는 달리 matrix와 2차원 배열은 동일하다. 

2차원 배열을 is.matrix function에 확인해 보아도 TRUE가 return 되는 것을 확인할 수 있다.