[ADsP]4.R 데이터 구조 ( vector , list, dataframe )
😃
R에서 간단히 파일을 입출력하는 방법을 알아보았다. 이제 그 데이터를 가지고 분석하기 위해서 내부적으로 R의 데이터 구조로 저장해야 한다. R에는 크게 벡터(vector), 리스트(list), 행렬(matrix), 배열(Arrays), 요인(Factors), 데이터프레임(Dataframe), 스칼라(scala) 로 나눌 수 있다.
R 데이터 구조
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에 대한 간단한 데이터 구조를 확인했다. 각 데이터 구조마다 특성이 다르기 때문에 적시적소에 필요한 데이터 구조를 사용하는 것은 쉽지 않을 거라 생각한다. 또한 사용하고자 하는 분석 알고리즘에 따라 사용해야하는 데이터 구조가 달라질 것으로 생각된다.