R 에서 데이터 분석을 하다보면 데이터셋 에서 필요한 부분만 선별적으로 취사선택해서 별도로 분석 마트를 만드는 경우가 다반사입니다.  따라서 이번 데이터 프레임에서의 변수 선택 방법을 잘 알아두시면 데이터셋을 떡주무르듯이 가지고 노는데 아주 유용할 것입니다.

 

R에서 데이터를 선별하는 방법으로 indexing 에 대해서 이전에 소개해드린적이 있는데요(☞ R indexing 바로가기), 선별 조건이 까다로워질수록 indexing 프로그램(index[]와 which() 함수 사용)이 복작해해지는 반면, subset() 함수는 상대적으로 깔끔한 면이 있습니다.  아래 두개의 기법별 예제를 보시고 사용하기에 편한 기법을 이용하시면 되겠습니다.  

 

실습을 위해서 mtcars 데이터 프레임을 활용하겠습니다.  mtcars는 자동차 관련된 11개 변수, 32개 관측치로 구성된 데이터 프레임이 되겠습니다. 이번 실습에는 아래 색칠해 놓은 연비(mpg), 실린더 개수(cyl), 변속기(am) 의 세개 변수를 사용하겠습니다.

 

> help(mtcars)
mtcars

Format

A data frame with 32 observations on 11 variables.

[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (lb/1000)
[, 7] qsec 1/4 mile time
[, 8] vs V/S
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears
[,11] carb Number of carburetors

Source

Henderson and Velleman (1981), Building multiple regression models interactively. Biometrics, 37, 391–411.

 

> str(mtcars)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
> 
>
head(mtcars) mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

 

만약 아래의 요건으로 데이터 마트를 구성해야 한다고 해봅시다.

 

"변속기가 자동(am == 0)이고 & 실린더가 4개 또는 6개 (cyl == 4 or cyl == 6) 인
자동차들의
연비(mpg) 평균(mean())는?"

 

"변속기가 수동(am == 1)이고 & 실린더가 4개 또는 6개 (cyl == 4 or cyl == 6)) 인 자동차들의
연비(mpg) 평균(mean())는?"

 

 

(1) indexing & which() 함수를 활용한 특정 조건을 만족하는 변수, 관측치 선택


> attach(mtcars) >

> # (a) 변속기가 자동이고 & 실린더가 4개, 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별
> mtcars_mart_0 <- mtcars[ which( am == 0 & cyl %in% c(4, 6)), c("mpg", "cyl", "am")] > mtcars_mart_0 mpg cyl am Hornet 4 Drive 21.4 6 0 Valiant 18.1 6 0 Merc 240D 24.4 4 0 Merc 230 22.8 4 0 Merc 280 19.2 6 0 Merc 280C 17.8 6 0 Toyota Corona 21.5 4 0

> > mean(mtcars_mart_0$mpg) [1] 20.74286

> # (b) 변속기가 수동이고 & 실린더가 4개, 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별 > mtcars_mart_1 <- mtcars[ which( am == 1 & cyl %in% c(4, 6)), c("mpg", "cyl", "am")] > mtcars_mart_1 mpg cyl am Mazda RX4 21.0 6 1 Mazda RX4 Wag 21.0 6 1 Datsun 710 22.8 4 1 Fiat 128 32.4 4 1 Honda Civic 30.4 4 1 Toyota Corolla 33.9 4 1 Fiat X1-9 27.3 4 1 Porsche 914-2 26.0 4 1 Lotus Europa 30.4 4 1 Ferrari Dino 19.7 6 1 Volvo 142E 21.4 4 1

> > mean(mtcars_mart_1$mpg) [1] 26.02727 > > detach(mtcars)

 

attach()와 detach()로 데이터 프레임을 활성화해놓고 indexing을 했음에 유의하세요.

 

위의 indexing 에서 변수를 선택할 때 c("mpg", "cyl", "am")이라고 변수명을 직접 입력했는데요, 열의 위치를 숫자로 c(1, 2, 9) 라고 입력해도 동일한 결과가 나옵니다.

 

> mtcars_mart_9 <- mtcars[ which( am == 0 & cyl %in% c(4, 6)), c(1, 2, 9)] > mtcars_mart_9 mpg cyl am Hornet 4 Drive 21.4 6 0 Valiant 18.1 6 0 Merc 240D 24.4 4 0 Merc 230 22.8 4 0 Merc 280 19.2 6 0 Merc 280C 17.8 6 0 Toyota Corona 21.5 4 0

 

 

 (2) subset(Data 이름, select = c(변수명), subset = (선별 조건)) 변수, 관측치 선택

 

> # (a) 변속기가 자동이고 & 실린더가 4개 or 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별

> mtcars_subset_0 <- subset(mtcars, + select = c(mpg, cyl, am), + subset = (am == 0 & cyl %in% c(4, 6))) > mtcars_subset_0 mpg cyl am Hornet 4 Drive 21.4 6 0 Valiant 18.1 6 0 Merc 240D 24.4 4 0 Merc 230 22.8 4 0 Merc 280 19.2 6 0 Merc 280C 17.8 6 0 Toyota Corona 21.5 4 0 > mean(mtcars_subset_0$mpg) [1] 20.74286 >

> # %in% 대신 수직바 '|' (or) 를 써서 할 수도 있음

> subset(mtcars, + select = c(mpg, cyl, am), + subset = ((am == 0 & cyl == 4) | (am == 0 & cyl == 6))) mpg cyl am Hornet 4 Drive 21.4 6 0 Valiant 18.1 6 0 Merc 240D 24.4 4 0 Merc 230 22.8 4 0 Merc 280 19.2 6 0 Merc 280C 17.8 6 0 Toyota Corona 21.5 4 0
>

>

> # (b) 변속기가 수동이고 & 실린더가 4개 or 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별 > mtcars_subset_1 <- subset(mtcars, + select = c(mpg, cyl, am), + subset = (am == 1 & cyl %in% c(4, 6))) > mtcars_subset_1 mpg cyl am Mazda RX4 21.0 6 1 Mazda RX4 Wag 21.0 6 1 Datsun 710 22.8 4 1 Fiat 128 32.4 4 1 Honda Civic 30.4 4 1 Toyota Corolla 33.9 4 1 Fiat X1-9 27.3 4 1 Porsche 914-2 26.0 4 1 Lotus Europa 30.4 4 1 Ferrari Dino 19.7 6 1 Volvo 142E 21.4 4 1 > mean(mtcars_subset_1$mpg) [1] 26.02727

 

 

만약, 데이터프레임에서 1개의 변수만을 indexing & which() 함수로 해서 새로운 객체에 할당하면 vector로 생성이 됩니다.  반면에, 데이터프레임에서 1개의 변수만을 subset() 함수로 해서 새로운 객체에 할당하면 dataframe 으로 생성이 되는 차이가 있습니다.  따라서, 사용 목적/용도가 뭐냐에 따라서 그에 맞는 방법을 사용하시기 바랍니다. 

 

 

아래에는 연속 선택 c(1:5), 혹은 제외 -c(1:5)를 하는 팁을 소개하였습니다.  indexing 기법에서도 동일합니다.  여러개의 변수를 순서에 따라서 일괄 선택할 때는 일일이 변수를 나열하지 않고 몇번째에서 몇번째까지 숫자나 혹은 변수명을 : 을 사용해서 지정해주면 되니 편하겠지요.  제외하려면 - 를 사용하면 끝.  편하죠?!

 

> # 연속 선택 : c(1:5) > mtcars_subset_1_5 <- subset(mtcars, + select = c(1:5) + ) > > head(mtcars_subset_1_5) mpg cyl disp hp drat Mazda RX4 21.0 6 160 110 3.90 Mazda RX4 Wag 21.0 6 160 110 3.90 Datsun 710 22.8 4 108 93 3.85 Hornet 4 Drive 21.4 6 258 110 3.08 Hornet Sportabout 18.7 8 360 175 3.15 Valiant 18.1 6 225 105 2.76 > > # 제외 : -c() > mtcars_subset_6_11 <- subset(mtcars, + select = -c(1:5) + ) > > head(mtcars_subset_6_11) wt qsec vs am gear carb Mazda RX4 2.620 16.46 0 1 4 4 Mazda RX4 Wag 2.875 17.02 0 1 4 4 Datsun 710 2.320 18.61 1 1 4 1 Hornet 4 Drive 3.215 19.44 1 0 3 1 Hornet Sportabout 3.440 17.02 0 0 3 2 Valiant 3.460 20.22 1 0 3 1

 

 



(3) dplyr 패키지의 select() 로 변수 선택, filter() 로 조건에 맞는 관측치 선택, 

     summarize() 요약 통계량 계산



> install.packages("dplyr")

> library(dplyr)

> # (a) 변속기가 자동(am == 0)이고 & 실린더가 4개 or 6개인 자동차의 평균 연비

> mtcars %>% select(mpg, cyl, am) %>% filter(am == 0 & cyl %in% c(4, 6))

   mpg cyl am

1 21.4   6  0

2 18.1   6  0

3 24.4   4  0

4 22.8   4  0

5 19.2   6  0

6 17.8   6  0

7 21.5   4  0

> mtcars %>% select(mpg, cyl, am) %>% filter(am == 0 & cyl %in% c(4, 6)) %>% summarise(mean(mpg))

  mean(mpg)

1  20.74286

> # (b) 변속기가 수동(am == 1)이고 & 실린더가 4개 or 6개인 자동차의 평균 연비

> mtcars %>% select(mpg, cyl, am) %>% filter(am == 1 & cyl %in% c(4, 6))

    mpg cyl am

1  21.0   6  1

2  21.0   6  1

3  22.8   4  1

4  32.4   4  1

5  30.4   4  1

6  33.9   4  1

7  27.3   4  1

8  26.0   4  1

9  30.4   4  1

10 19.7   6  1

11 21.4   4  1

> mtcars %>% select(mpg, cyl, am) %>% filter(am == 1 & cyl %in% c(4, 6)) %>% summarise(mean(mpg))

  mean(mpg)

1  26.02727

 



이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 


728x90
반응형
Posted by Rfriend
,