獨斷論

통계 R 사용설명서 11 - 두 데이터 합치기 또는 병합 본문

과학과 기술/R 통계

통계 R 사용설명서 11 - 두 데이터 합치기 또는 병합

부르칸 2016. 5. 17. 03:50

데이터 행렬 또는 데이터 프레임(data frame)에 을 이리저리 조작하는 것은 좀 자질구레하지만 알아두면 유용한 방법이다. 여기서 알아볼 것은 기존의 데이터에 열방향으로 데이터 합치기, 행방향으로 데이터 합치기, 원하는 변수만 선택, 필요없는 변수 제거, observation 또는 subject의 선택 등에서 알아볼 것이다.



merge()를 이용하여 열방향으로 데이터 합치는 방법


데이터 파일이 두 개 이상의 파일에 존재한다면 R에서 불러온 후에 하나의 변수로 합쳐야 하는 경우가 있는데 이때 이 방법을 이용한다.


일단 아래 스크립트를 보자.


1

2

3

4

5

6

7


8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

 > Genus <- c("Acer", "Acer", "Ajuga", "Conyza", "Lamium")
 > species <- c("platanoides", "palmatum", "reptans", "sumatrensis", "album")
 > lifeform <- c("tree", "tree", "herb", "annual", "herb")
 > lifeforms <- data.frame(Genus, species, lifeform)
 >
 > Genus <- c("Acer", "Ajuga", "Brassica", "Chamerion", "Conyza", "Lamium")
 > species <- c("platanoides", "reptans", "napus", "angustifolium", "bilbaoana", "album")
 > flowering <- c("May", "June", "April", "July", "August", "January")
 > flowerings <- data.frame(Genus, species, flowering)
 >
 > lifeforms
    Genus     species lifeform
 1   Acer platanoides     tree
 2   Acer    palmatum     tree
 3  Ajuga     reptans     herb
 4 Conyza sumatrensis   annual
 5 Lamium       album     herb
 > flowerings
       Genus       species flowering
 1      Acer   platanoides       May
 2     Ajuga       reptans      June
 3  Brassica         napus     April
 4 Chamerion angustifolium      July
 5    Conyza     bilbaoana    August
 6    Lamium         album   January
 > mydat <- merge(lifeforms, flowerings)
 > mydat
    Genus     species lifeform flowering
 1   Acer platanoides     tree       May
 2  Ajuga     reptans     herb      June
 3 Lamium       album     herb   January


1~4 줄까지는 lifeforms라는 데이터 프레임 변수를 만들었다.

6~9 줄까지는 flowerings라는 데이터 프레임 변수를 만들었다.

11~25 줄까지는 이들 두 변수를 console에서 어떻게 되었는지 한번 출력하여보았다.

26번째 줄에서 이 두 데이터 프레임을 하나로 합쳤는데 그 결과가 28~31줄에 나타나 있다.

중요한 것은 열방향으로 합쳤을때 새롭게 생긴 데이터 프레임의 각각의 변수, 즉 Genus, species, lifeform, flowering에 결측값이 없도록 만들어졌다는 것이다. 그래서 28~31 줄에 나타난 열방향으로 합쳐진 데이터프레임에는 observation들이 3개 밖에 남지 않았다.


만약 결측값이 생기더라도 두 데이터를 무작정 열방향으로 합치고 싶을땐 어떻게 해야할까?


1

2

3

4

5

6

7

8

9

10

11

 > mydat_total <- merge(lifeforms, flowerings, all=TRUE)
 > mydat_total
      Genus       species lifeform flowering
 1      Acer      palmatum     tree      <NA>
 2      Acer   platanoides     tree       May
 3     Ajuga       reptans     herb      June
 4    Conyza   sumatrensis   annual      <NA>
 5    Conyza     bilbaoana     <NA>    August
 6    Lamium         album     herb   January
 7  Brassica         napus     <NA>     April
 8 Chamerion angustifolium     <NA>      July


merge()함수에 all=TRUE라는 옵션을 넣으면 결측값이 생기더라도 무작정 다 합쳐버린다.



cbind()를 이용하여 열방향으로 데이터 합치는 방법


주로 행렬을 열방향으로 합칠때 사용한다.


1

 > X <- matrix(c(1,2,3,4,5,6), nrow = 2)
 > X
      [,1] [,2] [,3]
 [1,]    1    3    5
 [2,]    2    4    6
 > Y <- matrix(c(11,12,13,14,15,16), nrow=2)
 > Y
      [,1] [,2] [,3]
 [1,]   11   13   15
 [2,]   12   14   16
 > Z <- cbind(X, Y)
 > Z
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    3    5   11   13   15
 [2,]    2    4    6   12   14   16


별 설명은 필요없으리라 본다.



rbind()를 이용하여 행방향으로 두 데이터 합치는 방법

주로 행렬을 행방향으로 합치는데 사용되지만 데이터프레임에도 사용할수도 있다. 이때에는 두 데이터프레임에 있는 변수가 같아야만 한다.


1

 > id <- c(1, 2, 3, 4, 5)
 > gender <- c("M", "F", "F", "F", "M")
 > age <- c(20, 21, 53, 82, 25)
 > q1 <- c(10, 3, 5, 8, 4)
 > q2 <- c(7, NA, 4, 5, 9)
 > q3 <- c(9, NA, 8, 9, 9)
 > mydat1 <- data.frame(id, gender, age, q1, q2, q3, 
+                     stringAsFactors = FALSE)
>
> id <- c(11, 12, 13, 14, 15)
> gender <- c("F", "F", "F", "F", "F")
> age <- c(26, 41, 33, 88, 11)
> q1 <- c(6, NA, 5, 9, 1)
> q2 <- c(8, 4, 4, 5, 2)
> q3 <- c(1, 1, 8, 4, 3)
> mydat2 <- data.frame(id, gender, age, q1, q2, q3, 
+                     stringAsFactors = FALSE)
>
> mydat_total <- rbind(mydat1, mydat2)
> mydat_total
   id gender age q1 q2 q3 stringAsFactors
1   1      M  20 10  7  9           FALSE
2   2      F  21  3 NA NA           FALSE
3   3      F  53  5  4  8           FALSE
4   4      F  82  8  5  9           FALSE
5   5      M  25  4  9  9           FALSE
6  11      F  26  6  8  1           FALSE
7  12      F  41 NA  4  1           FALSE
8  13      F  33  5  4  8           FALSE
9  14      F  88  9  5  4           FALSE
10 15      F  11  1  2  3           FALSE


다음에는 데이터를 조작하는 방법으로 subset( )이라는 명령어에 대해서 알아보겠다.

Comments