[ADsP]4.R 데이터 구조 ( vector , list, dataframe )

😃

R에서 간단히 파일을 입출력하는 방법을 알아보았다. 이제 그 데이터를 가지고 분석하기 위해서 내부적으로 R의 데이터 구조로 저장해야 한다. R에는 크게 벡터(vector), 리스트(list), 행렬(matrix), 배열(Arrays), 요인(Factors), 데이터프레임(Dataframe), 스칼라(scala) 로 나눌 수 있다.


R 데이터 구조

Data-structure-and-data-types-While-data-stored-as-a-scalar-vector-or-matrix-must-be-of

1. 스칼라(scala)

단일 값을 갖는 자료구조로 프로그램 내에서 원소가 하나인 벡터처럼 인식된다. logical, integer, double, complex, character 와 같은 데이터 뿐만 아니라 NULL, NA(Not Available)도 포함한 모든 단일 값을 이야기한다.

> pi 
[1] 3.141593
> mode(pi)
[1] "numaric"

2. 벡터 (Vector)

벡터는 같은 데이터 타입(type) 또는 같은 모드(mode)를 갖는 데이터들의 집합을 나타내는 데이터 구조이다. (타입은 R의 primitive 자료형을 의미하고 모드는 R 객체에 대한 타입을 의미한다. 내부적으로 연산을 위해서 이를 구분해 놓은 것이 아닌가 생각된다.)

> v1 = c(0,"a",T) #다르게 입력해도 charactor값으로 맞춰버린다. (같은 속성의 값만 가질 수 있다) 
> v1
[1] "0"    "a"    "TRUE"

일반적인 프로그래밍 언어와 마찬가지로 벡터는 인덱스를 통해 접근할 수 있다. 약간 헷갈릴 수 있는 부분은 많은 언어들은 인덱스 0이 첫번째 값을 가리키는 반면에 R언어는 인덱스 1이 첫번째 값을 가리킨다.

> v1 = c(1,2,3,4,5,6)
> v1[2]
[1] 2

벡터는 인덱스를 통해 여러개의 원소로 구성된 하위 벡터를 부분적으로 반환할 수 있다.

> v1 = c(1,2,3,4,5,6)
> v1[c(3,5,6)]
[1] 3 5 6

벡터는 테이블의 header와 유사하게 원소들의 이름을 부여할 수 있다.

> pos=c(37.135,150.234)
> names(pos) = c("latitude", "longitude")
> pos
latitude longitude 
  37.135  150.234 
> pos["latitude"]
latitude 
  37.135 

3. 요인(Factor)

범주값을 갖는 벡터의 형태로 , 범주 내의 고유값들을 요인의 수준(level)이라고 한다. R의 요인은 java로 봤을 때 enum과 유사한 형태로 데이터가 저장된다. , 집단 분류를 위해 사용된다.

> factor("M", level=c("M","F"))
[1] M
Levels: M F
> factor(c("A","B","C","A","C"))
[1] A B C A C
Levels: A B C

4. 행렬 (Matrix)

2차원의 원소값을 가지는 벡터를 행렬이라고 한다.

> matrix(1:9, c(3,3))
> arr1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

5.배열 (Arrays)

3차원 이상의 벡터를 배열이라고 한다.

> array(1:12,c(2,3,2))
, , 1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

6. 데이터 프레임 (Dataframe)

행렬과 유사하게 2차원의 데이터 구조이다. 행렬의 경우 구성 데이터의 타입이 반드시 동일해야 하는 반면 데이터 프레임은 데이터 타입이 동일하지 않아도 된다. 이러한 이유로 R에서 데이터분석 시 매우 빈번하게 사용되는 타입이다.

데이터 프레임의 각 열(column)은 벡터 또는 요인 값으로 같은 데이터 타입을 갖는다. 필요에 따라서 행/열에 이름을 설정할 수 있다.

> data.frame(product=c("TV","phone","laptop"),price=c(200,100,50))
  product price
1      TV   200
2   phone   100
3  laptop    50

7.리스트 (List)

가장 유연한 데이터 구조로, 리스트는 벡터와 다르게 여러 타입의 데이터가 포함될 수 있고 행렬의 길이가 각 행마다 다르게 설정하는 것도 가능하다.. 의미상 리스트는 객체를 저장하는 데이터 구조이기 때문에 다양한 데이터 타입을 가질 수 있다. (데이터로 또다른 리스트, 데이터 프레임 등을 가질 수 있다)

> list(x=c("A","B","C","A","C"),
+ y=array(1:12,c(2,3,2)),
+ z=data.frame(product=c("TV","phone","laptop"),price=c(200,100,50)))
$x
[1] "A" "B" "C" "A" "C"

$y
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12


$z
  product price
1      TV   200
2   phone   100
3  laptop    50


R에 대한 간단한 데이터 구조를 확인했다. 각 데이터 구조마다 특성이 다르기 때문에 적시적소에 필요한 데이터 구조를 사용하는 것은 쉽지 않을 거라 생각한다. 또한 사용하고자 하는 분석 알고리즘에 따라 사용해야하는 데이터 구조가 달라질 것으로 생각된다.