R에서 사용하는 데이터 셋의 형태
2011-05-09
dataframe
list
matrix
R 기초
R-Tips
vector
데이터 형태
R에서 사용하는 가장 기본적인 데이터 셋의 형태는 벡터(vector)이다. 하나 이상의 숫자, 문자 등의 집합을 벡터(vector)라고 한다. 벡터를 행과 열로 가지는 표 형식으로 확장한 것이 행렬(matrix)이다. 또한, 벡터의 집합을 원소로 가지는 데이터의 형태를 리스트(list)라 하고, 리스트에 포함된 벡터의 길이가 모두 같을 때 이를 데이터프레임(data frame)으로 취급할 수 있다. 이 장에서는 R에서 사용하는 데이터 셋의 형태에 대해서 정리해 보도록 한다.
벡터(vector)
R은 실수, 복소수, 문자열, 논리값 등의 기본 데이터를 하나씩 단독으로 다루는 것이 아니라 같은 종류의 데이터를 여러개 묶은 벡터 형식으로 다룬다. 벡터를 만드는 가장 간단한 방법은 함수 c()
를 이용하는 방법이다. 함수 c()
의 인수 값으로 벡터에 넣고 싶은 값들을 열거하면 목적하는 벡터를 만들 수 있다.
> # 벡터의 작성
> v <- c("abc", 12, 0.456, TRUE)
> v
#> [1] "abc" "12" "0.456" "TRUE"
> # 함수 is.vector()를 이용하여 벡터인지 아닌지 확인
> is.vector(v)
#> [1] TRUE
위의 예에서 볼 수 있듯이 벡터의 원소에 숫자와 문자가 함께 포함되면 벡터의 원소들은 모두 문자(character)로 변환됨에 주의해야 한다. 어떤 값이 벡터인지 아닌지를 확인하기 위해서는 함수 is.vector()
를 이용한다. 함수의 결과 값이 TRUE
이면 벡터임을 FALSE
라면 벡터가 아닌 다른 형태임을 알려 준다.
벡터의 길이를 구할때는 함수 length()
를 이용한다.
> length(v)
#> [1] 4
함수 c()
이외에도 연속된 값을 생성하는 함수 seq()
, 일정한 패턴의 반복에 의해 벡터를 생성하는 함수 rep()
도 유용하게 사용된다.
> # 1부터 5까지 1씩 증가하는 벡터
> 1:5
#> [1] 1 2 3 4 5
> # 5부터 -5까지 -1씩 감소하는 벡터
> 5:-5
#> [1] 5 4 3 2 1 0 -1 -2 -3 -4 -5
> # 벡터 (1, 2, 3)을 길이 10이 될때까지 반복
> rep(1:3, length=10)
#> [1] 1 2 3 1 2 3 1 2 3 1
> # 벡터 (1, 2, 3, 4, 5)를 두번 반복
> rep(1:5, times=2)
#> [1] 1 2 3 4 5 1 2 3 4 5
> # 1부터 10까지를 7등분한 벡터
> seq(1, 10, length=7)
#> [1] 1.0 2.5 4.0 5.5 7.0 8.5 10.0
> # 1부터 10까지 2씩 증가하는 벡터
> seq(1, 10, by=2)
#> [1] 1 3 5 7 9
> # 패턴을 가지는 벡터
> sequence(c(3, 6, 5))
#> [1] 1 2 3 1 2 3 4 5 6 1 2 3 4 5
> # 중복된 값을 제외한 벡터
> unique(rep(1:3, length=10))
#> [1] 1 2 3
> # 0을 10개 늘어놓은 벡터
> numeric(10)
#> [1] 0 0 0 0 0 0 0 0 0 0
R의 연산자나 많은 함수는 인수의 값이 하나의 값이 아닌 백터로 주어져도 문제없이 이용할 수 있다.
벡터 연산의 결과는 벡터이다.
> # -5부터 5까지 1씩 증가하는 정수 백터를 작성
> x <- -5:5
> x
#> [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> x+2
#> [1] -3 -2 -1 0 1 2 3 4 5 6 7
> x*2
#> [1] -10 -8 -6 -4 -2 0 2 4 6 8 10
벡터와 한 값의 연산은 벡터의 각 원소에 같은 조작(사칙연산)을 하지만 벡터와 벡터의 연산은 같은 위치의 원소들끼리 계산 한다.
> y <- -5:5
> x
#> [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> y
#> [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> # 벡터와 벡터의 덧셈
> x+y
#> [1] -10 -8 -6 -4 -2 0 2 4 6 8 10
> # 벡터와 벡터의 나눗셈
> x/y
#> [1] 1 1 1 1 1 NaN 1 1 1 1 1
> # 벡터와 벡터의 곱셈
> x*y
#> [1] 25 16 9 4 1 0 1 4 9 16 25
행렬(matrix)
벡터는 원소를 단지 1열로 열거해놓은 것 뿐이지만, 실제 데이터는 행과 열로 이루어진 표 형식을 따르는 것이 많다. 이러한 데이터 형식을 R에서는 행렬이라 하고, 표 형식의 데이터에 대한 분석함수를 이용하기 위해서는 미리 행렬화 시킬 필요가 있다. 행렬은 함수 matrix()
를 이용해 바탕이 되는 벡터에 행의 수 혹은 열의 수에 대한 정보를 추가함으로써 만들 수 있다.
> # 5부터 60까지 5씩 증가하는 정수벡터 작성
> v <- seq(5, 60, by = 5)
> v
#> [1] 5 10 15 20 25 30 35 40 45 50 55 60
> # 열의 수가 4인 행렬
> matrix(v, ncol = 4)
#> [,1] [,2] [,3] [,4]
#> [1,] 5 20 35 50
#> [2,] 10 25 40 55
#> [3,] 15 30 45 60
> # 행의 수가 4인 행렬
> matrix(v, nrow = 4)
#> [,1] [,2] [,3]
#> [1,] 5 25 45
#> [2,] 10 30 50
#> [3,] 15 35 55
#> [4,] 20 40 60
리스트(list)
리스트는 벡터나 행렬을 한꺼번에 취급할 수 있는 형식이다. 복수의 관련된 벡터나 행렬을 하나의 리스트에 정리하여 보존할 수 있으며 함수 list()
를 이용하여 작성합니다. 함수의 인수 값은 리스트에 포함되는 벡터나 행렬을 지정하거나, 데이터의 참조용 이름을 부여하여 사용할 수도 있다.
> # (3,2,1)을 3번 반복하는 벡터 작성
> myvector <- rep(c(3, 2, 1), 3)
> myvector
#> [1] 3 2 1 3 2 1 3 2 1
> mymatrix <- matrix(1:12, ncol = 4)
> mymatrix
#> [,1] [,2] [,3] [,4]
#> [1,] 1 4 7 10
#> [2,] 2 5 8 11
#> [3,] 3 6 9 12
> mylist <- list(dataA = myvector, dataB = mymatrix)
> mylist
#> $dataA
#> [1] 3 2 1 3 2 1 3 2 1
#>
#> $dataB
#> [,1] [,2] [,3] [,4]
#> [1,] 1 4 7 10
#> [2,] 2 5 8 11
#> [3,] 3 6 9 12
데이터프레임(data frame)
데이터프레임은 R에서 분석을 수행할 때 가장 빈번히 사용되는 형식이다. 외부파일로부터 R에 데이터를 불러올 때 사용하는 함수 군은 불러들인 데이터를 모두 데이터프레임으로 변환시키기 때문이다. 데이터프레임은 리스트의 한 종류로 리스트에 포함된 모든 값이 길이가 같은 벡터일 때, 혹은 행의 수, 열의 수가 같은 행렬에 한해 그 리스트를 함수 data.frame()
을 이용해 데이터프레임으로 변환시킬 수 있다.
> v1 <- 1:5
> v2 <- 6:10
> v1
#> [1] 1 2 3 4 5
> v2
#> [1] 6 7 8 9 10
> mylist <- list(dataA = v1, dataB = v2)
> mylist
#> $dataA
#> [1] 1 2 3 4 5
#>
#> $dataB
#> [1] 6 7 8 9 10
> data.frame(mylist)
#> dataA dataB
#> 1 1 6
#> 2 2 7
#> 3 3 8
#> 4 4 9
#> 5 5 10
데이터프레임은 행렬의 집합으로써 작성할 수도 있지만, 많은 경우 벡터의 집합으로 사용된다. 같은 길이의 벡터의 집합인 데이터프레임은 각각의 벡터를 열 원소로 간주하는 표 형식의 데이터로 생각할 수가 있어서 행 단위, 열 단위의 데이터의 주입, 삭제, 추출조작을 할 수 있다. 또한, 데이터프레임을 작성할 때 각 열과 행에는 행의 이름과 열의 이름이 자동으로 부여된다. 열의 이름은 리스트의 참조용 이름이 사용되며 행의 이름은 함수 rownames()
, 열의 이름은 함수 colnames()
로 확인할 수 있으며 자유롭게 변경할 수 있다.
> mydf <- data.frame(mylist)
> # 행 이름 확인
> rownames(mydf)
#> [1] "1" "2" "3" "4" "5"
> # 열 이름 확인
> colnames(mydf)
#> [1] "dataA" "dataB"
> # 행 이름 변경
> rownames(mydf) <- c("one", "two", "three", "four", "five")
> mydf
#> dataA dataB
#> one 1 6
#> two 2 7
#> three 3 8
#> four 4 9
#> five 5 10
factor와 level
벡터의 특수한 형태로 설문조사의 선택문항 등 카테고리를 저장할 수 있는 벡터인 factor라는 형태가 있다. factor는 벡터를 기본으로 하여 함수 factor()
를 이용하여 작성할 수 있다.
> xv <- c("A", "C", "B", "A", "A", "C", "B")
> x <- factor(xv, levels = c("A", "B", "C"))
> xv
#> [1] "A" "C" "B" "A" "A" "C" "B"
> x
#> [1] A C B A A C B
#> Levels: A B C
factor 함수에서는 그 기본이 되는 벡터와 levels
인수에 의해 、factor의 레벨(혹은 이름)을 지정한다. level은 factor에 포함된 카테고리의 목록이라 할 수 있다. factor와 벡터의 내용을 R에서 출력해보면 factor는 벡터에 레벨정보를 추가한 것임을 알 수 있다. R에서는 이 레벨 정보를 이용해 카테고리별 단순집계나 그래프의 성형을 하므로 카테고리 변수는 가능한 벡터가 아닌 factor로 변환해 놓는 것이 좋다. factor와 벡터는 외형상 큰 차이는 없어 보이지만 R의 내부에서는 매우 다른 형태로 취급한다. 아래의 예와 같이 벡터를 숫자로 변환하는 as.numeric()
함수를 이용하여 그 결과를 살펴보면 factor는 레벨의 순서에 따라 그 값이 존재하지만, 문자형 벡터는 그렇지 않음을 알 수 있다.
> as.numeric(x)
#> [1] 1 3 2 1 1 3 2
> as.numeric(xv)
#> [1] NA NA NA NA NA NA NA