해당 포스트는 MASS패키지의 Cars93 데이터셋을 Origin 변수값에 따라 두 그룹으로 분할하는 방법을 소개합니다.
INTRO
데이터 분석을 하다보면 'train/test', '합격/불합격', '남자/여자' 등 데이터셋을 분할하는 경우가 많이 발생합니다. 데이터셋을 분할하기 위해서는 기준이 필요한데, 특정 컬럼 또는 데이터에 기준이 있는 경우라면 쉽게 해결이 가능합니다.
아래에서는 Cars93
데이터셋을 이용하여 Origin
컬럼값에 따라 데이터를 분할하는 방법
문제 풀이
MASS 패키지에서 제공되는 Cars93
데이터셋을 이용하여 Origin
컬럼값에 따라 데이터를 분할하는 R코드는 다음과 같습니다.
아래 코드는 MASS 패키지를 불러온 후, Cars93
데이터셋을 로드합니다. 그리고 split()
함수를 사용하여 Origin
컬럼값에 따라 데이터를 분할하고, 분할된 데이터는 by_origin
변수에 저장합니다.
# MASS 패키지에서 Cars93 데이터셋 로드하기
library(MASS)
data(Cars93)
# Origin 컬럼값에 따라 데이터 분할하기
by_origin <- split(Cars93, Cars93$Origin)
by_origin
$Asia Manufacturer Model Type ... Origin 1 Acura Integra Small ... Asia 2 Acura Legend Midsize ... Asia 3 Audi 90 Compact ... Asia 4 Audi 100 Midsize ... Asia 5 BMW 535i Midsize ... Asia ... 21 Mitsubishi Mirage Small ... Asia 22 Nissan Sentra Small ... Asia 23 Nissan Altima Midsize ... Asia 24 Nissan Quest Van ... Asia 25 Nissan Maxima Midsize ... Asia ... $Europe Manufacturer Model Type ... Origin 26 Audi 100 Midsize ... Europe 27 BMW 535i Midsize ... Europe 28 BMW 525i Midsize ... Europe 29 BMW 318i Small ... Europe 30 BMW 320i Small ... Europe ... 38 Saab 9000 Midsize ... Europe 39 Saturn SL Small ... Europe $USA Manufacturer Model Type ... Origin 40 Buick Century Midsize ... USA 41 Buick LeSabre Large ... USA 42 Buick Roadmaster Large ... USA 43 Buick Riviera Midsize ... USA 44 Cadillac DeVille Large ... USA ... 91 Plymouth Laser Sporty ... USA 92 Pontiac LeMans Small ... USA 93 Pontiac Sunbird Small ... USA 94 Pontiac Firebird Sporty ... USA 95 GMC Vandura Van ... USA attr(,"split_type") [1] "data.frame" attr(,"split_labels") Origin 1 Asia 2 Europe 3 USA
by_origin
변수를 출력하면, Origin
컬럼값에 따라 분할된 데이터가 리스트(List) 형태로 출력됩니다. 각각의 리스트 항목은 Origin
컬럼값에 해당하는 데이터 프레임(Data Frame)입니다.
위 코드 출력에서 볼 수 있듯이, by_origin
리스트는 Asia
, Europe
, USA
세 가지 항목으로 나뉘어 있으며, 각각의 항목은 해당 국가에서 출시된 차량들의 데이터 프레임(Data Frame)으로 이루어져 있습니다. 리스트(List)의 마지막 부분에는 attr()
함수를 통해 분할된 데이터의 종류가 "data.frame"임을 확인할 수 있습니다.
만약, USA
출신 차량의 데이터만 출력한다면 by_origin$USA
와 같이 코드를 입력하면 됩니다. 출력 결과가 길어질 수 있어, 아래에서는 해당 결과의 구조(structure)를 출력해 보겠습니다.
str(by_origin$USA)
'data.frame': 48 obs. of 27 variables: $ Manufacturer : Factor w/ 32 levels "Acura","Audi",..: 4 4 4 4 5 5 6 6 6 6 ... $ Model : Factor w/ 93 levels "100","190E","240",..: 24 54 74 73 35 79 22 30 17 58 ... $ Type : Factor w/ 6 levels "Compact","Large",..: 3 2 2 3 2 3 1 1 5 3 ... $ Min.Price : num 14.2 19.9 22.6 26.3 33 37.5 8.5 11.4 13.4 13.4 ... $ Price : num 15.7 20.8 23.7 26.3 34.7 40.1 13.4 11.4 15.1 15.9 ... $ Max.Price : num 17.3 21.7 24.9 26.3 36.3 42.7 18.3 11.4 16.8 18.4 ... $ MPG.city : int 22 19 16 19 16 16 25 25 19 21 ... $ MPG.highway : int 31 28 25 27 25 25 36 34 28 29 ... $ AirBags : Factor w/ 3 levels "Driver & Passenger",..: 2 2 2 2 2 1 3 2 1 3 ... $ DriveTrain : Factor w/ 3 levels "4WD","Front",..: 2 2 3 2 2 2 2 2 3 2 ... $ Cylinders : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 5 5 2 2 4 2 ... $ EngineSize : num 2.2 3.8 5.7 3.8 4.9 4.6 2.2 2.2 3.4 2.2 ... $ Horsepower : int 110 170 180 170 200 295 110 110 160 110 ... $ RPM : int 5200 4800 4000 4800 4100 6000 5200 5200 4600 5200 ... $ Rev.per.mile : int 2565 1570 1320 1690 1510 1985 2380 2665 1805 2595 ... $ Man.trans.avail : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 2 2 2 1 ... $ Fuel.tank.capacity: num 16.4 18 23 18.8 18 20 15.2 15.6 15.5 16.5 ... $ Passengers : int 6 6 6 5 6 5 5 5 4 6 ... $ Length : int 189 200 216 198 206 204 182 184 193 198 ... $ Wheelbase : int 105 111 116 108 114 111 101 103 101 108 ... $ Width : int 69 74 78 73 73 74 66 68 74 71 ... $ Turn.circle : int 41 42 45 41 43 44 38 39 43 40 ... $ Rear.seat.room : num 28 30.5 30.5 26.5 35 31 25 26 25 28.5 ... $ Luggage.room : int 16 17 21 14 18 14 13 14 13 16 ... $ Weight : int 2880 3470 4105 3495 3620 3935 2490 2785 3240 3195 ... $ Origin : Factor w/ 2 levels "USA","non-USA": 1 1 1 1 1 1 1 1 1 1 ... $ Make : Factor w/ 93 levels "Acura Integra",..: 6 7 9 8 10 11 15 16 13 18 ...
tidyverse 패키지 활용 풀이
다음은 tidyverse 패키지를 이용한 R 코드 풀이입니다. 아래 코드를 실행하면 Origin
컬럼값에 따라 분할된 데이터셋이 출력되며, 분할된 데이터셋은 리스트(List) 형태로 저장되어 있습니다. 리스트의 각 원소는 Origin
컬럼값 하나에 해당하는 데이터 프레임(Data Frame)입니다.
# 패키지 불러오기
library(tidyverse)
library(MASS)
# 데이터 불러오기
data("Cars93", package = "MASS")
# Origin 컬럼값에 따라 분할
cars_split <- Cars93 %>%
group_split(Origin)
# 분할된 데이터셋 출력
print(cars_split)
[[1]] Manufacturer Model Type ... 1 Acura Integra Small ... 2 Acura Legend Midsize ... 3 Audi 90 Compact ... 4 Audi 100 Midsize ... 5 BMW 535i Midsize ... 6 Buick Century Midsize ... 7 Buick LeSabre Large ... 8 Buick Roadmaster Large ... 9 Buick Riviera Personal... 10 Chevrolet Corsica Compact ... 11 Chevrolet Camaro Sporty ... 12 Chevrolet Lumina Midsize ... 13 Chevrolet Monte Carlo Personal... [[2]] Manufacturer Model Type ... 1 Cadillac Fleetwood Large ... 2 Cadillac DeVille Large ... 3 Cadillac Seville Midsize ... 4 Chevrolet Caprice Large ... 5 Chevrolet Impala Large ... 6 Pontiac Bonneville Large ... 7 Pontiac Firebird Sporty ... 8 Pontiac Grand Prix Midsize ... [[3]] ...
마무리
이번 포스트에서는 MASS 패키지에서 제공되는 Cars93
데이터셋을 이용하여 Origin
컬럼값에 따라 데이터를 분할하는 방법을 설명했습니다. 내장 함수 및 tidyverse 패키지를 활용한 풀이에서는 모두 Origin
컬럼값에 따라 데이터를 분할하였고,각 리스트 항목은 Origin
컬럼값에 해당하는 데이터 프레임(Data Frame)으로 저장된 것을 확인하였습니다.
사용자의 분석 환경(내부망, 외부 패키지 사용 불가 등)에 따라 필요한 코드를 참고하여 선택적으로 활용하시면 됩니다.
관련 링크
[1] [R] 데이터 샘플링 (Data Sampling)
[2] [R] R에서 반응 변수 비율에 맞춰 데이터셋 분할하기 (15회 ADP 실기 기출)
[3] MASS 패키지
[4] tidyverse 패키지