'데이터 프레임 변수 선택'에 해당되는 글 1건

  1. 2015.07.27 R 데이터 프레임 변수 선택 : which(), subset(), select (7)

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

 

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

 

 

 R 데이터 프레임 변수 선택 : subset(), select

 

실습을 위해서 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 == c(4, 6)) 인
자동차들의
연비(mpg) 평균(mean())는?"

 

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

 

 

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

 

> attach(mtcars) >

> # (a) 변속기가 자동이고 & 실린더가 4개, 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별
>
mtcars_mart_0 <- mtcars[ which( am == 0 & cyl == 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 230 22.8 4 0 Merc 280 19.2 6 0 Toyota Corona 21.5 4 0 > mean(mtcars_mart_0$mpg) [1] 20.6 >

> # (b) 변속기가 수동이고 & 실린더가 4개, 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별 > mtcars_mart_1 <- mtcars[ which( am == 1 & cyl == c(4, 6)), c("mpg", "cyl", "am")] > mtcars_mart_1 mpg cyl am Mazda RX4 Wag 21.0 6 1 Datsun 710 22.8 4 1 Honda Civic 30.4 4 1 Porsche 914-2 26.0 4 1 Ferrari Dino 19.7 6 1 > mean(mtcars_mart_1$mpg) [1] 23.98 > > detach(mtcars)

 

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

 

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

 

> mtcars_mart_9 <- mtcars[ which( am == 0 & cyl == 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 230 22.8 4 0 Merc 280 19.2 6 0 Toyota Corona 21.5 4 0

 

 

(2) subset(dataset이름, select = c(변수명), subset = (선별 조건)) 를 활용한 변수 선택

 

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

> # (b) 변속기가 수동이고 & 실린더가 4개, 6개인 자동차의 연비, 실린더, 자동/수동 변수 선별 > mtcars_subset_1 <- subset( mtcars, + select = c( mpg, cyl, am ), + subset = (am == 1 & cyl == c(4, 6)) + ) > > mtcars_subset_1 mpg cyl am Mazda RX4 Wag 21.0 6 1 Datsun 710 22.8 4 1 Honda Civic 30.4 4 1 Porsche 914-2 26.0 4 1 Ferrari Dino 19.7 6 1 > > mean(mtcars_subset_1$mpg) [1] 23.98

 

 

저는 개인적으로는 subset()이 프로그래밍 하기에 더 체계가 잡혀보여서 subset()을 선호하는 편입니다.

 

 

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

 

 

아래에는 연속 선택 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

 

 

 

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

 

Posted by R Friend R_Friend