R 데이터 프레임에서 조건에 맞는 관측치, 변수 선택 : which(), subset(), select(), filter()
R 분석과 프로그래밍/R 데이터 전처리 2015. 7. 27. 13:15R 에서 데이터 분석을 하다보면 데이터셋 에서 필요한 부분만 선별적으로 취사선택해서 별도로 분석 마트를 만드는 경우가 다반사입니다. 따라서 이번 데이터 프레임에서의 변수 선택 방법을 잘 알아두시면 데이터셋을 떡주무르듯이 가지고 노는데 아주 유용할 것입니다.
R에서 데이터를 선별하는 방법으로 indexing 에 대해서 이전에 소개해드린적이 있는데요(☞ R indexing 바로가기), 선별 조건이 까다로워질수록 indexing 프로그램(index[]와 which() 함수 사용)이 복작해해지는 반면, subset() 함수는 상대적으로 깔끔한 면이 있습니다. 아래 두개의 기법별 예제를 보시고 사용하기에 편한 기법을 이용하시면 되겠습니다.
실습을 위해서 mtcars 데이터 프레임을 활용하겠습니다. mtcars는 자동차 관련된 11개 변수, 32개 관측치로 구성된 데이터 프레임이 되겠습니다. 이번 실습에는 아래 색칠해 놓은 연비(mpg), 실린더 개수(cyl), 변속기(am) 의 세개 변수를 사용하겠습니다.
> help(mtcars) mtcars FormatA data frame with 32 observations on 11 variables.
SourceHenderson 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 ... > |
만약 아래의 요건으로 데이터 마트를 구성해야 한다고 해봅시다.
"변속기가 자동(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()와 detach()로 데이터 프레임을 활성화해놓고 indexing을 했음에 유의하세요.
위의 indexing 에서 변수를 선택할 때 c("mpg", "cyl", "am")이라고 변수명을 직접 입력했는데요, 열의 위치를 숫자로 c(1, 2, 9) 라고 입력해도 동일한 결과가 나옵니다.
|
(2) subset(Data 이름, select = c(변수명), subset = (선별 조건)) 변수, 관측치 선택 |
|
만약, 데이터프레임에서 1개의 변수만을 indexing & which() 함수로 해서 새로운 객체에 할당하면 vector로 생성이 됩니다. 반면에, 데이터프레임에서 1개의 변수만을 subset() 함수로 해서 새로운 객체에 할당하면 dataframe 으로 생성이 되는 차이가 있습니다. 따라서, 사용 목적/용도가 뭐냐에 따라서 그에 맞는 방법을 사용하시기 바랍니다.
아래에는 연속 선택 c(1:5), 혹은 제외 -c(1:5)를 하는 팁을 소개하였습니다. indexing 기법에서도 동일합니다. 여러개의 변수를 순서에 따라서 일괄 선택할 때는 일일이 변수를 나열하지 않고 몇번째에서 몇번째까지 숫자나 혹은 변수명을 : 을 사용해서 지정해주면 되니 편하겠지요. 제외하려면 - 를 사용하면 끝. 편하죠?!
|
(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
|
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
R 데이터 프레임 결합 : rbind(), cbind(), merge() (39) | 2015.07.27 |
---|---|
R 벡터, 데이터 프레임 정렬 : sort(), order(), arrange() (0) | 2015.07.27 |
R 데이터 프레임 신규 변수 생성 : dataframe$variable, transform() (0) | 2015.07.27 |
R 데이터 프레임 변수명 변경 names(), rename() (2) | 2015.07.26 |
R 행렬 연산 : +, -, *, /, ^, %*%, cbind(), rbind(), colMeans(), rowMeans(), colSums(), rowSums(), t() (8) | 2015.07.26 |