[R] 기초 - 데이터 결합 (열 결합, 행 결합)

: ) YOUNG·2022년 5월 4일
2

R

목록 보기
2/8
post-thumbnail

R에서 데이터 결합


예시 데이터 생성


라이브러리 호출

install.packages("quantmod")
library(quantmod)

quantmod library를 사용하면 yahoo의 finance 웹사이트에서 주가데이터와 환율데이터를 다운로드해서 가져올 수 있습니다.

해당 데이터로 실습을 합니다.

sec <- getSymbols(Symbols = "005930.KS", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE )

str(sec)

getSymbols 함수를 사용해서 데이터를 불러오고
Symbols자리에 종목코드를 집어넣으면 해당 주식의 날짜별 데이터를 가져올 수 있습니다.


출력

> str(sec)
An 'xts' object on 2021-10-01/2021-12-30 containing:
  Data: num [1:63, 1:6] 73900 73000 72600 71600 72300 70700 68700 69000 70200 70200 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "005930.KS.Open" "005930.KS.High" "005930.KS.Low" "005930.KS.Close" ...
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:
List of 2
 $ src    : chr "yahoo"
 $ updated: POSIXct[1:1], format: "2022-05-04 20:27:01"
 
 

해당 데이터가 list 형으로 되어있어서 dataframe으로 수정합니다.

sec <- as.data.frame(sec)


cbind 함수


cbind 함수를 사용해서 sec데이터의 005930.KS.Close와 005930.KS.Volume 2개의 컬럼만 따로 추출하여 날짜를 기준으로 결합하겠습니다.


head(sec[c("005930.KS.Close", "005930.KS.Volume")])

sec <- cbind(date = rownames(sec), symbol = "005930.KS", 
			sec[c("005930.KS.Close", "005930.KS.Volume")])
            
head(sec)


출력

> head(sec)
                 date    symbol 005930.KS.Close 005930.KS.Volume
2021-10-01 2021-10-01 005930.KS           73200         15803395
2021-10-05 2021-10-05 005930.KS           72200         24013921
2021-10-06 2021-10-06 005930.KS           71300         18956962
2021-10-07 2021-10-07 005930.KS           71600         13683532
2021-10-08 2021-10-08 005930.KS           71500         14043287
2021-10-12 2021-10-12 005930.KS           69000         31001484

위 cbind에서 date를 rownames(sec)로 따로 만들어줘서
행 이름과 date가 겹치기 때문에 행 이름은 제거를 해줘야 합니다.


행 이름 제거 & close, volume으로 컬럼이름 수정

rownames(sec) <- NULL
colnames(hmc)[c(3, 4)] <- c("close", "volume")

출력

# 기존 변경 전
> head(sec)
        date    symbol 005930.KS.Close 005930.KS.Volume
1 2021-10-01 005930.KS           73200         15803395
2 2021-10-05 005930.KS           72200         24013921
3 2021-10-06 005930.KS           71300         18956962
4 2021-10-07 005930.KS           71600         13683532
5 2021-10-08 005930.KS           71500         14043287
6 2021-10-12 005930.KS           69000         31001484



# 변경 후
# 행 이름 제거, # 컬럼 이름 변경
> rownames(sec) <- NULL
> colnames(sec)[c(3, 4)] <- c("close", "volume")
> head(sec)
        date    symbol close   volume
1 2021-10-01 005930.KS 73200 15803395
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484

행 이름 정상적으로 제거되었고, 컬럼 명이 변경되었음을 확인할 수 있습니다.



rbind 함수


rbind를 하기 위해서 예시데이터를 똑같이 하나 더 만들어 줍니다.
위에서 똑같은 방법으로 설명은 생략

hmc <- getSymbols(Symbols = "005387.KS", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE ) 
hmc <- as.data.frame(hmc)
head(hmc)

head(hmc[c("005387.KS.Close", "005387.KS.Volume")])

hmc <- cbind(date = rownames(hmc), symbol = "005387.KS",
hmc[c("005387.KS.Close", "005387.KS.Volume")] )

rownames(hmc) <- NULL
colnames(hmc)[c(3, 4)] <- c("close", "volume")

head(hmc)


sec와 hmc 2개의 데이터가 생성되었습니다.

> head(hmc)
        date    symbol close volume
1 2021-10-01 005387.KS 92800 108008
2 2021-10-05 005387.KS 91500 142854
3 2021-10-06 005387.KS 93100  85533
4 2021-10-07 005387.KS 95800  65835
5 2021-10-08 005387.KS 96100  80350
6 2021-10-12 005387.KS 95700  52477


> head(sec)
        date    symbol close   volume
1 2021-10-01 005930.KS 73200 15803395
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484

데이터는 다르지만 똑같은 형태인 데이터셋을 2개 만들었습니다.


곧바로 rbind함수를 실행해보겠습니다.

stock <- rbind(sec, hmc)
head(stock)


종목 코드 열인 symbol을 보면 알 수 있습니다.

1 ~ 63까지가 삼성전자의 데이터이고,
64 ~ 126까지가 현대자동차의 데이터입니다.

이렇게 2개의 다른 데이터셋을 결합할 수 있습니다.

> stock
          date    symbol  close   volume
1   2021-10-01 005930.KS  73200 15803395 # 삼성전자 데이터
2   2021-10-05 005930.KS  72200 24013921
3   2021-10-06 005930.KS  71300 18956962
4   2021-10-07 005930.KS  71600 13683532
5   2021-10-08 005930.KS  71500 14043287
6   2021-10-12 005930.KS  69000 31001484
7   2021-10-13 005930.KS  68800 24172015
8   2021-10-14 005930.KS  69400 19520641
9   2021-10-15 005930.KS  70100 18051612
10  2021-10-18 005930.KS  70200 13486391
11  2021-10-19 005930.KS  70600  9507991
12  2021-10-20 005930.KS  70300 10151638
13  2021-10-21 005930.KS  70200 10891094
14  2021-10-22 005930.KS  70400  8395448
15  2021-10-25 005930.KS  70200 10029621
16  2021-10-26 005930.KS  71100 10528252
17  2021-10-27 005930.KS  70100 10295316
18  2021-10-28 005930.KS  70700 20644902
19  2021-10-29 005930.KS  69800 17016151
20  2021-11-01 005930.KS  69900 11503729
21  2021-11-02 005930.KS  71500 16812570
22  2021-11-03 005930.KS  70400 12770428
23  2021-11-04 005930.KS  70600 11818987
24  2021-11-05 005930.KS  70200 12667743
25  2021-11-08 005930.KS  70600 11121981
26  2021-11-09 005930.KS  70500 11159589
27  2021-11-10 005930.KS  70200  9422009
28  2021-11-11 005930.KS  69900 11489122
29  2021-11-12 005930.KS  70600 10087450
30  2021-11-15 005930.KS  71400 12420710
31  2021-11-16 005930.KS  71300 10919239
32  2021-11-17 005930.KS  70700 11027606
33  2021-11-18 005930.KS  70200 10144957
34  2021-11-19 005930.KS  71200 11954728
35  2021-11-22 005930.KS  74900 27506623
36  2021-11-23 005930.KS  75300 22029195
37  2021-11-24 005930.KS  74800 15652305
38  2021-11-25 005930.KS  73700 12559258
39  2021-11-26 005930.KS  72300 13002242
40  2021-11-29 005930.KS  72300 16682559
41  2021-11-30 005930.KS  71300 30364841
42  2021-12-01 005930.KS  74400 21954856
43  2021-12-02 005930.KS  75800 23652940
44  2021-12-03 005930.KS  75600 18330240
45  2021-12-06 005930.KS  76300 16391250
46  2021-12-07 005930.KS  77400 19232453
47  2021-12-08 005930.KS  77400 21558340
48  2021-12-09 005930.KS  78200 21604528
49  2021-12-10 005930.KS  76900  9155219
50  2021-12-13 005930.KS  76800 15038750
51  2021-12-14 005930.KS  77000 10976660
52  2021-12-15 005930.KS  77600  9584939
53  2021-12-16 005930.KS  77800 11996128
54  2021-12-17 005930.KS  78000 13108479
55  2021-12-20 005930.KS  77100 11264375
56  2021-12-21 005930.KS  78100 14245298
57  2021-12-22 005930.KS  79400 17105892
58  2021-12-23 005930.KS  79900 13577498
59  2021-12-24 005930.KS  80500 12086380
60  2021-12-27 005930.KS  80200 10783368
61  2021-12-28 005930.KS  80300 18226325
62  2021-12-29 005930.KS  78800 19794795
63  2021-12-30 005930.KS  78300 14236700
64  2021-10-01 005387.KS  92800   108008 # 여기서부터 현대자동차 데이터
65  2021-10-05 005387.KS  91500   142854
66  2021-10-06 005387.KS  93100    85533
67  2021-10-07 005387.KS  95800    65835
68  2021-10-08 005387.KS  96100    80350
69  2021-10-12 005387.KS  95700    52477
70  2021-10-13 005387.KS  98500    98226
71  2021-10-14 005387.KS  99100    75945
72  2021-10-15 005387.KS  99700   109056
73  2021-10-18 005387.KS 100000    43648
74  2021-10-19 005387.KS  99800    38447
75  2021-10-20 005387.KS  99100    52920
76  2021-10-21 005387.KS  98500    28210
77  2021-10-22 005387.KS  98000    53776
78  2021-10-25 005387.KS  98600    30712
79  2021-10-26 005387.KS 100000    49703
80  2021-10-27 005387.KS  99800    46890
81  2021-10-28 005387.KS  99600    65956
82  2021-10-29 005387.KS  97900   190494
83  2021-11-01 005387.KS  97300    38263
84  2021-11-02 005387.KS  99000    52010
85  2021-11-03 005387.KS  98600    52784
86  2021-11-04 005387.KS 101000   102459
87  2021-11-05 005387.KS 102000    50635
88  2021-11-08 005387.KS 102000    45959
89  2021-11-09 005387.KS 100500    43161
90  2021-11-10 005387.KS  99800    61779
91  2021-11-11 005387.KS  99000    62718
92  2021-11-12 005387.KS 100500    77660
93  2021-11-15 005387.KS 101500    50184
94  2021-11-16 005387.KS 100000    81583
95  2021-11-17 005387.KS  99700    99969
96  2021-11-18 005387.KS  99300    62083
97  2021-11-19 005387.KS 101000    93428
98  2021-11-22 005387.KS 103000   115000
99  2021-11-23 005387.KS 101000    49487
100 2021-11-24 005387.KS 100500    46581
101 2021-11-25 005387.KS  99000    44285
102 2021-11-26 005387.KS  96800    59202
103 2021-11-29 005387.KS  95000    64425
104 2021-11-30 005387.KS  92700   126889
105 2021-12-01 005387.KS  95200    57573
106 2021-12-02 005387.KS  98600    97508
107 2021-12-03 005387.KS  98700    58303
108 2021-12-06 005387.KS  99600    37288
109 2021-12-07 005387.KS 100000    74364
110 2021-12-08 005387.KS  99800    68506
111 2021-12-09 005387.KS  99500    73889
112 2021-12-10 005387.KS 100000    36045
113 2021-12-13 005387.KS 101500    74162
114 2021-12-14 005387.KS 102500    51064
115 2021-12-15 005387.KS 101500    54096
116 2021-12-16 005387.KS 102000    40362
117 2021-12-17 005387.KS 101500    82656
118 2021-12-20 005387.KS  99800    57000
119 2021-12-21 005387.KS 100500    49408
120 2021-12-22 005387.KS 102000    48258
121 2021-12-23 005387.KS 102000    42262
122 2021-12-24 005387.KS 105000    78738
123 2021-12-27 005387.KS 104500    69957
124 2021-12-28 005387.KS 105000    82228
125 2021-12-29 005387.KS 101000    88034
126 2021-12-30 005387.KS 101000    45697


merge 함수


이번에는 merge함수를 사용해서 열을 추가해보도록 하겠습니다.
아까와 같은 방식이지만, 다른 데이터인 달러 환율 데이터를 가져오겠습니다.

fx <- getSymbols(Symbols = "KRW=X", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE ) 
fx <- as.data.frame(fx)
head(fx[c("KRW=X.Close")])


fx <- cbind(date = rownames(fx), fx[c("KRW=X.Close")])
head(fx)


> head(fx)
                 date KRW=X.Close
2021-10-01 2021-10-01     1183.72
2021-10-04 2021-10-04     1180.00
2021-10-05 2021-10-05     1183.78
2021-10-06 2021-10-06     1187.17
2021-10-07 2021-10-07     1191.38
2021-10-08 2021-10-08     1191.15

똑같이 행 이름은 없애지만, 이번에는 KRW=X.Close 한 열만 가져오겠습니다.

이후에 해당 열을 close로 열 이름을 변경해줍니다.

rownames(fx) <- NULL
colnames(fx)[c(2)] <- c("close")
head(fx)

출력

> head(fx)
        date   close
1 2021-10-01 1183.72
2 2021-10-04 1180.00
3 2021-10-05 1183.78
4 2021-10-06 1187.17
5 2021-10-07 1191.38
6 2021-10-08 1191.15

date 열과 close 열이 있음을 확인했습니다.

그렇다면, sec 데이터에 fx 데이터와 같은 열이 있는지 확인해야 합니다.
이 조건을 확인하기 위해서 intersect함수를 사용하면 같은 열이 있는지 알 수 있습니다.


> # 공통열이 뭐가 있는지 확인
> intersect(names(sec), names(fx))
[1] "date"  "close"

두 데이터셋에 date, close의 2개의 열이 동시에 있음을 확인할 수 있습니다.

우리는 date인 날짜를 기준으로 열에 추가해보겠습니다.

# 날짜를 기준으로해서 데이터를 결합
report <- merge(sec, fx, by = "date")
head(report)

결과

> head(report)
        date    symbol close.x   volume close.y
1 2021-10-01 005930.KS   73200 15803395 1183.72
2 2021-10-05 005930.KS   72200 24013921 1183.78
3 2021-10-06 005930.KS   71300 18956962 1187.17
4 2021-10-07 005930.KS   71600 13683532 1191.38
5 2021-10-08 005930.KS   71500 14043287 1191.15
6 2021-10-12 005930.KS   69000 31001484 1195.80

date를 기준으로 결합해서 date는 하나로 모두 축소되었고,
close는 2개의 데이터가 겹치므로 컬럼이름이 변경된 것을 확인할 수 있습니다.

기존에 있던 sec의 closeclose.x가 되었고,
fx의 closeclose.y가 되었습니다.




%in% 연산자


이번에는 mtcars의 데이터를 가지고 진행해보겠습니다.

head(mtcars)
car <- mtcars

차 이름인 행 이름을 name컬럼을 생성해서 삽입


car$name <- rownames(car)
rownames(car) <- NULL
head(car)

출력

> head(car)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb              name
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4         Mazda RX4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     Mazda RX4 Wag
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        Datsun 710
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    Hornet 4 Drive
5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 Hornet Sportabout
6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1           Valiant

행 이름이 name컬럼이 만들어져서 옮겨간 모습입니다.

그럼 이번에는 2개의 조건으로 데이터를 분리해서 2개의 데이터셋을 만들어보겠습니다

  1. hp가 145 초과인 차량
  2. wt가 3.2 미만인 차량
# 1. 145hp 초과의 자동차
highhp.car <- car[car$hp > 145,]

# 2. 3200 파운드 미만의 자동차
lightwt.car <- car[car$wt < 3.2,]

출력

> head(highhp.car)
    mpg cyl  disp  hp drat   wt  qsec vs am gear carb               name
5  18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2  Hornet Sportabout
7  14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4         Duster 360
12 16.4   8 275.8 180 3.07 4.07 17.40  0  0    3    3         Merc 450SE
13 17.3   8 275.8 180 3.07 3.73 17.60  0  0    3    3         Merc 450SL
14 15.2   8 275.8 180 3.07 3.78 18.00  0  0    3    3        Merc 450SLC
15 10.4   8 472.0 205 2.93 5.25 17.98  0  0    3    4 Cadillac Fleetwood


> head(lightwt.car)
    mpg cyl  disp  hp drat    wt  qsec vs am gear carb          name
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4     Mazda RX4
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4 Mazda RX4 Wag
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    Datsun 710
8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2     Merc 240D
9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2      Merc 230
18 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1      Fiat 128

이제 %in% 연산자를 통해서 둘의 겹치는 자동차 이름을 한번 출력해보겠습니다.

index <- match(highhp.car$name, lightwt.car$name)
index

match함수를 통해서 두 데이터셋의 겹치는 부분의 index값을 알아낼수 있습니다.
만약 겹치지 않는다면, NA를 반환하고 일치하는 부분은 index값을 반환합니다.

match() 함수에서 두번째 인자를 기준으로 겹치는 값을 찾습니다.
여기서는 lightwt에서 highhp와 겹치는 값이 있는지 찾습니다.


출력

> index
 [1] NA NA NA NA NA NA NA NA NA NA NA NA 13 14 NA

결과를 보면
13, 14 index가 겹치는 값이라는 것을 알 수 있습니다.


이제 마지막으로 해당 인덱스의 값만 추출해보겠습니다

lightwt.car[na.omit(index), ]

출력

> lightwt.car[na.omit(index), ]
    mpg cyl disp  hp drat   wt qsec vs am gear carb           name
29 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4 Ford Pantera L
30 19.7   6  145 175 3.62 2.77 15.5  0  1    5    6   Ferrari Dino

index에 해당하는 열에서 na.omit으로 NA값은 모두 지우고, 출력하면
깔끔한 데이터를 얻을 수 있습니다.



0개의 댓글