獨斷論

통계 GNU R에서 데이터 구조 종류와 사용방법 본문

과학과 기술/R 통계

통계 GNU R에서 데이터 구조 종류와 사용방법

부르칸 2014. 4. 15. 14:37

R에서 사용되는 데이터 구조의 종류와 사용방법에 대해서 알아보자. 


벡터Vector

벡터에 데이터를 입력하기 위해서는 c()라는 함수를 이용하는데 여기서 c는 concatenate의 약자이다. 

> a <- c(5, 1.2, 6, -7.5, 100.0)

> b <- c('one', 'two', 'three')

> c <- c(TRUE, FALSE, TRUE, TRUE, T, F)

> c

벡터 각각의 원소는 아래와 같이 참조가 가능하다. 

> a[2]

> a[c(1,3)]

> a[3:5]

위 R script의 첫번째 줄은 a의 두번째 원소값이고, 두번째 줄은 a의 1번째와 3번째 원소값이고 세번째 줄은 a의 3에서 5번째 원소값을 의미한다. 


행렬matrix

행과 열로 이루어진 2차원 변수이다. 

데이터 입력은 matrix()라는 함수를 이용한다. 

> y <- matrix(c(1, 3, 5, 7, 9, 11, 13, 15), ncol=2)

> y

     [,1] [,2]

[1,]    1    9

[2,]    3   11

[3,]    5   13

[4,]    7   15

아무런 옵션이 주어지지 않는다면 열방향으로 데이터가 순서대로 들어간다는 것에 유의하여야 한다. 

만약 행방향으로 넣고 싶다면 아래와 같이 한다. 

> y <- matrix(c(1, 3, 5, 7, 9, 11, 13, 15), ncol=2, byrow=TRUE)

> y

     [,1] [,2]

[1,]    1    3

[2,]    5    7

[3,]    9   11

[4,]   13   15

변수 y의 두번째 열을 참조하고 싶다면 아래와 같이 수행한다. 
> y[, 2]
[1]  3  7 11 15
y의 두번째 행을 참조하고 싶다면 아래와 같이 수행한다. 
> y[2, ]
[1] 5 7
y의 2번째와 4번째 행의 2번째 열을 참조하고 싶다면 아래와 같이 수행한다. 

> y[c(2,4), 2]

[1]  7 15


배열Array

이것은 3차원 이상의 변수를 가진 것을 말한다. 

array()라는 함수를 이용하면 되는데 고급의 통계를 사용하지 않는 이상 잘 사용되지 않는 데이터 형이다. 

아래 R script는 [3x4x2] 크기의 array를 만드는 방법을 보여준다. 

> z <- array(1:24, c(3,4,2))

> z

, , 1


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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


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

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24

array(1:24, c(3,4,2))에서 첫번째 인자인 1:24는 들어갈 데이터 값이고 뒤에 c(3,4,2)는 array의 차원을 나타낸다. 
알기쉽게 생각한다면 [3x4] 행렬이 2개가 만들어졌다고 보면된다. 


Data Frame

data frame은 아주 유용한 데이터 형태이다.

아래와 같은 데이터를 가지고 있다고 가정할때 어떻게 이런 데이터를 입력하여야 할까? 

data frame을 이용하면 아주 편리하다. 

사용하는 함수는 data.frame()이다. 

아래 script는 위 데이터를 입력하는 방법을 보여준다.

> SubjID <- 1:4

> ExpDate <- c("01/25/1999", "02/05/1999", "02/25/1999", "03/01/1999")

> Age <- c(25, 41, 17, 50)

> Disease <- c("Type1", "Type1", "Type2", "Type2")

> Status <- c("Poor", "Poor", "Good", "Improving")

> Exp.Dat <- data.frame(SubjID, ExpDate, Age, Disease, Status)

> Exp.Dat

  SubjID    ExpDate Age Disease    Status

1      1 01/25/1999  25   Type1      Poor

2      2 02/05/1999  41   Type1      Poor

3      3 02/25/1999  17   Type2      Good

4      4 03/01/1999  50   Type2 Improving

만약 문자열들이 factor로 바뀌는 것을 방지하려면 아래와 같이 수행하면 된다. 
> Exp.Dat <- data.frame(SubjID, ExpDate, Age, Disease, Status, stringsAsFactors = FALSE)

data frame의 값들을 참조하기

data frame으로 선언된 변수의 값을 참조하는 방법은 여러가지가 있는데 

vector나 matrix처럼 참조할 수 있고

> Exp.Dat[1]

  SubjID

1      1

2      2

3      3

4      4

> Exp.Dat[2]

     ExpDate

1 01/25/1999

2 02/05/1999

3 02/25/1999

4 03/01/1999

> Exp.Dat[c(1,3)]

  SubjID Age

1      1  25

2      2  41

3      3  17

4      4  50

> Exp.Dat[1:3]

  SubjID    ExpDate Age

1      1 01/25/1999  25

2      2 02/05/1999  41

3      3 02/25/1999  17

4      4 03/01/1999  50

data frame의 column name을 가지고 참조할 수도 있다. 
> Exp.Dat$Disease
[1] "Type1" "Type1" "Type2" "Type2"
> Exp.Dat["Disease"]
  Disease
1   Type1
2   Type1
3   Type2
4   Type2
> Exp.Dat[c("SubjID", "Disease")]
  SubjID Disease
1      1   Type1
2      2   Type1
3      3   Type2
4      4   Type2


Factors

Nominal과 ordinal 변수들을 코딩하는 방법이며 factor()라는 함수를 이용한다. 

앞서 data.frame()을 이용할때 StatusDisease가 문자열로 저장되었지만 이제 이를 factor로 바꾸어 저장하여 보자. Nominal 변수는 unordered factor로 코딩되고 ordinal 변수는 ordered factor로 코딩된다. 즉, Disease는 unordered factor이고 Status는 ordered factor이다. 

> SubjID <- c(1,2,3,4)

> ExpDate <- c("01/25/1999", "02/25/1999", "02/25/1999", "03/01/1999")

> Age <- c(25, 41, 17, 50)

> Disease <- c("Type1", "Type1", "Type2", "Type2")

> Disease <- factor(Disease, order=FALSE)

> Status <- c("Poor", "Poor", "Good", "Improving")

> Status <- factor(Status, order=TRUE, levels=c("Poor", "Improving", "Good"))

> Exp.Dat <- data.frame(SubjID, ExpDate, Age, Disease, Status)

> str(Exp.Dat)

'data.frame':   4 obs. of  5 variables:

 $ SubjID : num  1 2 3 4

 $ ExpDate: Factor w/ 3 levels "01/25/1999","02/25/1999",..: 1 2 2 3

 $ Age    : num  25 41 17 50

 $ Disease: Factor w/ 2 levels "Type1","Type2": 1 1 2 2

 $ Status : Ord.factor w/ 3 levels "Poor"<"Improving"<..: 1 1 3 2

변수 Disease는 옵션에 order=FALSE라고 명시하여 unordered factor로 코딩하였고

변수 Status는 옵션에 order=TRUE라고 한 후에 그 level을 c()함수를 이용하여 설정하였다. 

그결과를 다음과 같이 확인할수가 있다. 

> Exp.Dat$Disease

[1] Type1 Type1 Type2 Type2

Levels: Type1 Type2

> Exp.Dat$Status

[1] Poor      Poor      Good      Improving

Levels: Poor < Improving < Good


List

List는 매우 복합적인 데이터형이인데,  스칼라, 벡터, 행렬, data frame 등을 한꺼번에 가질수 있는 변수형이다. 

list()라는 함수를 이용하여 만든다. 

> myname <- "Park"

> wifename <- "Kim"

> nchild <- 5

> childages <- c(5, 7, 9, 10, 15)

> mydat <- matrix(1:15, ncol=5)

> mylist <- list(my.name=myname, wife.name=wifename, no.child=nchild, child.ages=childages, family.dat=mydat)   # 이건 한 줄이다

> mylist

$my.name

[1] "Park"


$wife.name

[1] "Kim"


$no.child

[1] 5


$child.ages

[1]  5  7  9 10 15


$family.dat

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

[1,]    1    4    7   10   13

[2,]    2    5    8   11   14

[3,]    3    6    9   12   15

자신의 이름을 myname이라는 변수에 입력하고 처의 이름을 wifename에 입력하고 자식이 몇명인지 nchild에 입력하고 자식의 나이를 childages에 입력하고 가족에 대한 임의의 데이터를 mydat에 입력하였다. 
이런 각각의 변수들을 하나로 묶어줄 mylist라는 list형에 저장하였다. 

List 데이터 참조하기

List를 참조하려면 중괄호를 두번 사용하거나 $ 뒤에 list의 하위 변수명을 쓰면 된다. 

우선 중괄호 두번 사용하는 방법은 아래와 같다. 

> mylist[[1]]

[1] "Park"


> mylist[[2]]

[1] "Kim"


> mylist[[5]]

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

[1,]    1    4    7   10   13

[2,]    2    5    8   11   14

[3,]    3    6    9   12   15


> mylist[[5]][ ,1]

[1] 1 2 3


> mylist[[5]][1, ]

[1]  1  4  7 10 13


> mylist[[5]][1,3]

[1] 7

mylist[[1]]은 첫번째 하위 변수이므로 mylist의 my.name과 같다. 
mylist[[2]]는 두번째 하위 변수이므로 mylist의 wife.name과 같다. 

mylist[[5]]는 다섯번째 하위 변수이므로 mylist의 family.dat와 같다. 

그런데  family.dat가 행렬이므로 이 역시 행렬을 참조하는 방법을 이중 중괄호 뒤에 더할수 있다. 

mylist[[5]][ ,1]은 곧 family.dat의 첫번째 열이며

mylist[[5]][1, ]은 곧 family.dat의 첫번째 행이며

mylist[[5]][1,3]은 곧 family.dat의 첫번째 행 두번째 열의 값이다. 


이는 똑같이 하위 변수명을 이용하여 참조가 가능하다. 

> mylist$my.name

[1] "Park"


> mylist[["my.name"]]

[1] "Park"


> mylist$wife.name

[1] "Kim"


> mylist[["wife.name"]]

[1] "Kim"


> mylist$family.dat

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

[1,]    1    4    7   10   13

[2,]    2    5    8   11   14

[3,]    3    6    9   12   15


> mylist[["family.dat"]]

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

[1,]    1    4    7   10   13

[2,]    2    5    8   11   14

[3,]    3    6    9   12   15


> mylist[["family.dat"]][,1]

[1] 1 2 3


> mylist[["family.dat"]][1,]

[1]  1  4  7 10 13


> mylist[["family.dat"]][1,3]

[1] 7


Comments