獨斷論

통계 R 사용설명서 5 - 데이터 형태 data frame, list, factor 본문

과학과 기술/R 통계

통계 R 사용설명서 5 - 데이터 형태 data frame, list, factor

부르칸 2016. 2. 12. 02:11

앞서 벡터 행렬 배열을 했고 여기서는 좀더 복잡한 data frame과 리스트와 인자에 대해서 알아보자.

 

 

1. 데이터프레임형 변수, data frame

 

데이터프레임의 데이터 입력

 

행렬과 배열은 같은 형태의 데이터만 들어갈수있지만 data frame은 다른 종류의 데이터가 들어갈수 있다는 점이 다르다.

예를 들어 대학 졸업생들의 현재 취업과 사는 곳과 나이를 조사했다고 가정한다면 다음과 같은 형태의 데이터가 존재하게 된다.

 

ID  age  location  company
 1  30  Seoul  Samsung
 2  24  Pusan  Baeksu
 3  28  Daejon  LG
 4  29  Yosu  LG
 5  27  Ulsan  Hyundai

 

이제 위 데이터를 R에서 입력하면 다음과 같이 할수 있다.

 


1
2

3
4
5
6
7
8
9
10
11
12
 > alumID <- c(1, 2, 3, 4, 5)
 > age <- c(30, 24, 28, 28, 29)
 > location <- c("Seoul", "Pusan", "Daejon", "Yosu", "Ulsan")
 > company <- c("Samsung", "Baeksu", "LG", "LG", "Hyundai")
 > alumdat <- data.frame(alumID, age, location, company)
 > alumdat
   alumID age location company
 1      1  30    Seoul Samsung
 2      2  24    Pusan  Baeksu
 3      3  28   Daejon      LG
 4      4  28     Yosu      LG
 5      5  29    Ulsan Hyundai

alumdat라는 데이터프레임 변수가 생성되었다. 벡터나 행렬과의 다르게 기본적으로 각 열의 이름이 부여된다는 것이다. 첫번째 열은 그 이름이 alumID이고 데이터는 1,2,3,4,5가 입력되었다. 4번째 열의 이름은 company이고 그 데이터는 Samsung, None, LG, LG, Hyundai라는 문자가 들어갔다.

 

 

데이터프레임의 값들을 참조 또는 이용

 

기본적으로 데이터프레임 형일지라도 앞선 행렬처럼 참조하는 것이 가능하다.

 

1
2
3
4
5
6
7
 > alumdat[c(1,3)]
   alumID location
 1      1    Seoul
 2      2    Pusan
 3      3   Daejon
 4      4     Yosu
 5      5    Ulsan

그리고 다음과 같이 데이터프레임의 각 열의 이름을 사용하여 그 값을 얻을수도 있다.

 

1
2
3
4
5
6
7
 > alumdat[c("alumID", "location")]
   alumID location
 1      1    Seoul
 2      2    Pusan
 3      3   Daejon
 4      4     Yosu
 5      5    Ulsan

만약 데이터프레임의 어떤 열의 데이터를 사용하고자 할때는 다음과 같이 달러기호($) 사용할수도 있다.

 > alumdat$age
 [1] 30 24 28 28 29
 > alumdat$alumID
 [1] 1 2 3 4 5
 > alumdat$age + alumdat$alumID
 [1] 31 26 31 32 34

 

attach와 detach

 

attach()를 사용한다면 매번 데이터프레임 변수는 생략하고 그 데이터프레임 안에 있는 열의 이름만을 사용하는 것이 가능하다.

 

1
2
3
4
5
6
7
8
 > attach(alumdat)
 The following objects are masked _by_ .GlobalEnv:
 
     age, alumID, company, location
 
 > age + alumID
 [1] 31 26 31 32 34
 > detach(alumdat)

중요한점은 attach()를 사용한 후에는 꼭 detach()를 해아한다는 것이다.

안그런다면 그 뒤로 사용될 age는 모두 alumdat$age가 되기때문에 age라는 변수가 존재한다면 예상치 못한 계산결과가 나올수 있기때문이다. 그래서 attach()detach()보다는 with()를 사용하는것이 더 편리하다.

 

 

데이터프레임에서 with() 사용하기

 

with()를 사용하는 방법은 다음과 같다.

with(data, expr, ...)

with를 쓴 후에 그 뒤에 데이터프레임의 변수명을 쓰고 사용하고자 하는 명령어를 써 넣으면 된다. 명령어가 여러줄이라면 중괄호 { }를 사용한다.

1
2
3
4
5
6
7
8
 > with(alumdat,
 + {no_name_var <- age + alumID
 + no_name_var1 <<- age + alumID # with() 밖에서 변수를 사용가능하도록하는 연산자 <<- 를 사용함
 + })
 > no_name_var
 Error: object 'no_name_var' not found
 > no_name_var1
 [1] 31 26 31 32 34


재밌는 것은 with()안에서 새로이 생성된 변수는 with()밖에서는 사용할수 없다는 것이다.

with()밖에서 사용하기를 원한다면 새로운 연산자인 <<-를 사용하여야 한다.

 

2. 인자형 변수, Factor

 

통계에서 사용되는 순위형변수(ordinal variable)와 명목형변수(nominal variable)들은 R에서 인자형변수(factor)로 처리된다. 인자형변수를 만들려면 우선 문자열이나 숫자를 갖는 벡터로 변수를 만들고 이것을 인자형변수로 바꾸면 된다.

앞에 만들었던 alumdat에 경제적사정을 나타내는 변수 status를 더하여 여기에 Poor, Middle, Rich라는 인자를 가지도록 한다면 다음과 같이 하면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
 > status <- c("Poor", "Rich", "Middle", "Middle", "Rich")
 > status <- factor(status, ordered=TRUE)
 > status
 [1] Poor   Rich   Middle Middle Rich 
 Levels: Middle < Poor < Rich
 > alumdat1 <- data.frame(alumID, age, location, company, status)
 > alumdat1
   alumID age location company status
 1      1  30    Seoul Samsung   Poor
 2      2  24    Pusan  Baeksu   Rich
 3      3  28   Daejon      LG Middle
 4      4  28     Yosu      LG Middle
 5      5  29    Ulsan Hyundai   Rich

 

1번 줄에서 status라는 문자열 벡터를 만들었고

2번 줄에서 이를 인자형변수로 바꾸었다. ordered=TRUE라는 것은 인자형 변수가 순위형변수를 나타낸다는 말이다. 명목형변수를 만들려면 ordered=FALSE라고 하면 된다. 6번줄에서 data.frame()함수에 status를 하나 더하여 alumdat1을 만들어냈다.

 

재밌는 것은 인자형 변수의 순위가 지 맘대로 정해진다는 것인데 안타깝게도 여기서는 그 순위가 틀렸다. 대부분 제대로 되는데 말이다.  5번 줄에서 인자형변수의 순위가 Middle < Poor < Rich로 되어버렸지만 제대로 되려면 Poor < Middle < Rich가 되어야 할 것이다. 이를 위하여 그 순위를 명시적으로 제시해줄수가 있다.

 

1
2
3
4
5
6
7
 > status <- c("Poor", "Rich", "Middle", "Middle", "Rich")
 > status <- factor(status, ordered=TRUE, levels=c("Poor", "Middle", "Rich"))
 > status
 [1] Poor   Rich   Middle Middle Rich 
 Levels: Poor < Middle < Rich
 > alumdat1 <- data.frame(alumID, age, location, company, status)
 > alumdat1

 

2번째 줄에서 levels=c("Poor", "Middle", "Rich")를 더하여 그 순위를 명시해 주었다.

 

 

3. 리스트, List

리스트라는 변수형은 R에서 사용되는 가장 해괴한 변수중 하나인데 벡터, 행렬, 배열, 데이터프레임 등은 그 변수의 구조가 사각형처럼 딱 정해져있다면 리스트는 그 구조가 사각형이 아니라 여려가지 종류과 크기의 변수들에 대한 일련의 집합과도 같은 것이다.

아래 R script에서 문자열변수, 문자열벡터, 숫자행렬, 숫자벡터를 하나의 리스트로 만드는 예를 보여주었다.

 > nn <- "Hong gilldong"
 > ss <- c("Math", "History", "Composition", "Music")
 > s_score <- matrix(c(10, 20, 30, 40, 15, 25, 35, 45), nrow=2, byrow=TRUE)
 > s_score
      [,1] [,2] [,3] [,4]
 [1,]   10   20   30   40
 [2,]   15   25   35   45
 > f_score <- c(19, 29, 39, 49)
 > sublist <- list(Name = nn, Subjects = ss, Scores = s_score, FinalScore = f_score)
 > sublist
 $Name
 [1] "Hong gilldong"
 
 $Subjects
 [1] "Math"        "History"     "Composition" "Music"     
 
 $Scores
      [,1] [,2] [,3] [,4]
 [1,]   10   20   30   40
 [2,]   15   25   35   45
 
 $FinalScore
 [1] 19 29 39 49

 

1번째 줄에서 nn에 사람의 이름을 넣었고

2번째 줄에서 수강과목을 넣었고

3번째 줄에서 중간시험 성적을 넣었고

8번째 줄에 기말시험 성적을 넣었다

9번째 줄에서 이들을 하나의 리스트로 만들었다.

 

 

리스트 참조 방법

 

리스트는 대괄호 두개를 사용한다(즉, [[ ]]).

 > sublist[[2]]
 [1] "Math"        "History"     "Composition" "Music"     
 > sublist[["Subjects"]]
 [1] "Math"        "History"     "Composition" "Music"     
 > sublist[["Subjects"]][1]
 [1] "Math"
 > sublist[["Subjects"]][2]
 [1] "History"
 > sublist$Name
 [1] "Hong gilldong"
 > sublist$Subjects
 [1] "Math"        "History"     "Composition" "Music"


1번째 줄에서 sublist의 2번째 항목을 선택하기위하여 sublist[[2]]를 사용하였고 똑같이 이는 sublist의 Subjests에 해당되므로 sublist[["Subjects"]]라고 그 이름을 명시하였다. 또한 sublist[["Subjects"]]의 첫번째 항목을 표기하기 위하여 sublist[["Subjects"]][1]라고 하였으며 이는 Math라는 결과를 보여주었다. 그리고 달러기호를 사용해도 똑같은 결과가 나온다.

Comments