etc/R studio

R에서 엑셀 필터기능 쓰기

조달송 2021. 5. 21. 20:25
728x90

*R을 다루는 것에 있어서 아직 미숙하지만,

기억하고 공부할겸 기록하는 것이니

오류가 있을경우 알려주시면 감사하겠습니다:)

 

엑셀에서 유용하게 이용하는 필터기능을 R에서도 쓸 수 있다. 작은 데이터라면 엑셀에서도 어렵지 않게 처리가 가능하지만, 몇 만 건이 넘는 데이터에 대해서는 R에서 처리하는 것이 훨씬 빠르고 간편하다. 그래서 인구이동 데이터에서 원하는 시군구의 데이터만 추출하는 방법을 다루면서 그 과정을 기록하겠다.

 


csv파일 불러오기 및 filter 함수 실행을 위한 dplyr패키지 설치 

R에서 많이들 활용하는 dplyr 패키지에 filter 함수가 포함되어 있다. filter함수는 행을 추출하는 함수로 만약 전국의 데이터가 있는 경우 거기서 원하는 시군구의 데이터만 추출할 수 있도록 한다. 예를들어, 아래와 같은 인구이동 데이터(인구이동.csv)가 csv파일로 있다고 가정하자(물론 실제로는 이것보다 훨씬 큰 데이터겠지만)고 불러오자.

1 11 110 41 273 1
2 28 110 30 110 2
3 26 140 31 140 1
4 11 350 11 380 3
5 41 170 11 740 1
6 41 150 41 135 2
7 41 135 41 117 1
setwd("C:/R")
인구이동 <- read.csv("인구이동.csv", header=FALSE, encoding="UTF-8"
install.packages("dplyr")
library(dplyr)

먼저, 디렉토리 설정을 위해 setwd()를 실행하여 csv파일이 있고 작업을 진행할 폴더를 지정해준다. 이럴경우 파일을 불러올때 기본적으로 설정한 디렉토리에서 가져오기 때문에 따로 경로를 지정해줄 필요가 없다.

다음으로, 인구이동이라는 데이터셋에 위의 인구이동.csv 파일을 넣어준다. read.csv() 함수를 이용하여 넣어주면 된다. 앞서 설정한 디렉토리에 인구이동.csv파일이 포함되어 있을 경우, 위와 같이 입력하면 된다. 이때 header는 맨 첫행에 구분 값이 포함되어 있는가에 대한 설정이다. 구분이 포함되어 있으면 TRUE, 위의 표와 같이 포함되어 있지 않고 값만 포함되어 있을 경우 FALSE를 입력한다. 또한 숫자값에서 오류가 나는 경우가 종종있는데 이럴때는 encoding을 따로 설정해주면 된다. 없이 불러왔을때 오류가 없다면 생략해도 된다. 

다음으로는 dplyr 패키지를 설치해주고 불러오는 과정이다. install.packages()library()로 불러오면 된다. 

 

 names()함수로 구분 값 설정해주기 

위의 데이터와 같이 csv 파일에 구분값이 포함되어 있지 않을 경우, csv를 불러올때 header를 FALSE로 설정하고 다시 구분값을 넣어주어야 한다. header를 FALSE로 설정하여 불러올 경우, 열의 이름이 임의로 v1, v2, v3...로 설정되어 헷갈리기 때문이다. 그래서 아래의 표와 같이 전입시도, 전입시군구, 전출시도, 전출시군구, 전입사유에 대한 구분값을 입력해주어야 한다. 

  전입시도 전입시군구 전출시도 전출시군구 전입사유
1 11 110 41 273 1
2 28 110 30 110 2
3 26 140 31 140 1
4 11 350 11 380 3
5 41 170 11 740 1
6 41 150 41 135 2
names(인구이동) <- c("전입시도", "전입시군구", "전출시도", "전출시군구", "전입사유")

이때 이용하는 것이 base 패키지에 포함되어 있는 names()함수이다. 각 열에 원하는 열이름을 입력해줄 수 있는 함수이다.
names(데이터 프레임 명) <- c( "1열이름", "2열이름", "3열이름"...)

이렇게 하면, 원본데이터를 불러오고 기본적인 설정을 한 과정이 끝난다.

 

 filter()함수로 원하는 전입시도 및 전입시군구의 행만 추출하기  

위의 표에서 전입시도가 서울(11)인 데이터만 추출해보자. 이때 이용하는 것이 filter()함수로, filter(데이터프레임, 기준이되는 열==추출하고 싶은 열의 값) 을 입력하면 된다. 필자의 경우, 인구이동 데이터프레임에서 전입시도가 11인 데이터의 행만 추출하고 싶은 것이기 때문에 아래와 같이 입력하였다. 

filter(인구이동, 전입시도==11)

나아가서 전입시도와 전입시군구 모두 필터링을 해주어야 하는 경우를 생각해보자. 경기도(41) 중에서 의정부(150)와 안양시(170)의 데이터만 필요한 경우에는 앞에 한 것과 같이 전입시도를 경기도(41)로 설정한다고 해서 해결되지 않는다. 그래서 두가지의 조건을 걸어서 입력해주어야 한다. 

의정부안양 <- filter(인구이동, 전입시도==41 , 전입시군구 %in% c(150, 170))

전입시도와 전입시군구 사이에 입력된 ","는 &의 의미로, '전입시도값이 41이면서 동시에~'라는 의미로 그리고의 조건이 붙는 것이다. 전입시군구 다음에 입력된 %in%는 매칭을 확인하는 것인데, 한 변수 안에서 여러값을 추출할 때 이용할 수 있다고 한다. 그래서 전입시군구 변수 안에서 150(의정부)과 170(안양시) 데이터를 추출하는 것으로 해석하면 된다. 

 

추출한 데이터에서 특정 조건의 행은 제외하기

또 만약 앞의 과정과 같이 의정부와 안양시 데이터를 추출한 후, 같은 경기도 내에서 이동한 데이터는 제외하고 싶을 경우에도 filter 함수를 적용하면 된다. 이때는 전출시도가 경기도(41)인 데이터만 제외하면 되기 때문에 !를 이용하면 된다.

filter(의정부안양, 전출시도 !=41)

참고한 글: https://rpubs.com/jmhome/R_data_wrangling

              https://brunch.co.kr/@seoup5024/38

반응형