R로 데이터 다루기

R에서 dplyr을 이용해 데이터를 추출, 가공하는 방법을 알아봅니다


수강중

13. dplyr 함수들을 조합한 실전 데이터 다루기 1 - 2

데이터 탐색하기

task 7

지역구별 & 년도별 강수량 합계를 구하시오.

mutate

연도 변수가 따로 없기 때문에 y 라는 변수를 따로 만들어줘야한다. mutate로 연도 변수를 만든다.

climates %>%
    mutate(y = substr(ym, 1, 4))
    city       district ym     lon      lat      rainfall y   
1   서울특별시 강남구   201401 37.49666 127.063   NA      2014
2   서울특별시 강남구   201402 37.49666 127.063  187      2014
3   서울특별시 강남구   201403 37.49666 127.063  122      2014
4   서울특별시 강남구   201404 37.49666 127.063    0      2014

group_by

group_by로 지역과 연도 변수를 넣어준다.

climates %>%
    mutate(y = substr(ym, 1, 4)) %>%
    group_by(district, y)
    city       district ym     lon      lat      rainfall y   
1   서울특별시 강남구   201401 37.49666 127.063   NA      2014
2   서울특별시 강남구   201402 37.49666 127.063  187      2014
3   서울특별시 강남구   201403 37.49666 127.063  122      2014
4   서울특별시 강남구   201404 37.49666 127.063    0      2014

summarise

summarisesum 함수를 이용해 합계를 구한다.

climates %>%
    mutate(y = substr(ym, 1, 4)) %>%
    group_by(district, y) %>%
    summarise(sum.rainfall = sum(rainfall, na.rm = T))
   district y    sum.rainfall
1  강남구   2014  645        
2  강남구   2015  909        
3  강동구   2014  921        
4  강동구   2015  757        

task 8

서울지역 위도와 경도의 평균을 구하시오.

문제발생

group_by 로 먼저 경도와 위도를 선택하고 summarisemean 함수를 사용하여 실행해보자. 위도(lat)와 경도(lon)는 그룹 변수가 아니고 연속 변수이기 때문에 문제가 생긴다.

climates %>%
    group_by(lon,lat) %>%
    summarise(mean.lon = mean(lon), mean.lat = mean(lat))
   lon      lat      mean.lon mean.lat
1  37.46058 126.9008 37.46058 126.9008
2  37.46738 126.9453 37.46738 126.9453
3  37.47333 127.0312 37.47333 127.0312
4  37.49439 126.8563 37.49439 126.8563

table로 확인해보니 모든 구에 대한 데이터 개수가 24개로 동일하다. 그래서 mean으로 해도 상관이 없다. 만약 각 구에 대한 데이터 개수가 다를 경우, 중복을 제거해주는 작업이 필요하다.

climates %>%
    select(district) %>%
    table
.
  강남구   강동구   강북구   강서구   관악구   광진구   구로구   금천구 
      24       24       24       24       24       24       24       24 
  노원구   도봉구 동대문구   동작구   마포구 서대문구   서초구   성동구 
      24       24       24       24       24       24       24       24 

중복 제거

distinct

구만 선택한뒤에 개수를 알아보면 600 건이 있다.

climates %>% select(district) %>% nrow
[1] 600

distinct 를 활용하여 중복되는 부분을 없애고 다시 행 개수를 알아보면 총 25개의 구가 있는 것을 알 수 있다

climates %>% distinct(district) %>% select(district) %>% nrow
[1] 25

distinct에도 여러 개 변수를 넣을 수 있다. 위에서 생성한 위도와 경도의 평균을 구하는 함수에 중복 건수를 해결해주는 distinct를 추가한다. 중복이 있느냐에 따라 평균이나 합이 달라지기 때문에 잘 고려해야한다

climates %>% distinct(city, district, lon, lat) %>% select(district) %>% nrow
[1] 25

task 9

강수량 데이터에서 250mm 이상은 상, 50mm ~ 250mm는 중, 50mm 미만은 하로 변환해 보세요.

새로운 변수 생성

ifelse(강수량 데이터)

ifelse를 사용해 강수량 데이터 변수를 만드는데 조건을 작성한다.

climates %>%
    mutate(rainfall.grade = ifelse(rainfall >= 250, '상', ifelse(rainfall >= 50, '중', '하')))
    city       district ym     lon      lat      rainfall rainfall.grade
1   서울특별시 강남구   201401 37.49666 127.063   NA      NA            
2   서울특별시 강남구   201402 37.49666 127.063  187      중            
3   서울특별시 강남구   201403 37.49666 127.063  122      중            
4   서울특별시 강남구   201404 37.49666 127.063    0      하            

select를 이용해 구별 강수량 등급 확인한다.

climates %>%
    mutate(rainfall.grade = ifelse(rainfall >= 250, '상', ifelse(rainfall >= 50, '중', '하'))) %>%
    select(district, rainfall.grade) %>%
    table
          rainfall.grade
district   상 중 하
  강남구    0 12  7
  강동구    0 12  7
  강북구    0 15  9
  강서구    1 11  6
  관악구    2 10  6
  광진구    0 12  8
  구로구    0 13  7
  금천구    1 10 10
  노원구    1 13  6
  도봉구    0 13  8
  동대문구  1  9  9
  동작구    1 11  6
  마포구    0 12  7
  서대문구  0 10  9
  서초구    0 13  7
  성동구    0  9 11
  성북구    0 11  9
  송파구    0 12  7
  양천구    0  8  8
  영등포구  0 11 12
  용산구    0 11 13
  은평구    0 10  9
  종로구    0  8 15
  중구      0 12  6
  중랑구    0 16  4

select를 이용해 연도별 강수량 등급 확인한다.

climates %>%
    mutate(rainfall.grade = ifelse(rainfall >= 250, '상', ifelse(rainfall >= 50, '중', '하'))) %>%
    select(ym, rainfall.grade) %>%
    table
        rainfall.grade
ym       상 중 하
  201401  0 10  9
  201402  0 14  7
  201403  0 11 11
  201404  0 12  7
  201405  0 10 13
  201406  1 14  9
  201407  0 11  7
  201408  0 15  3
  201409  0  8 12
  201410  0 11 11
  201411  0 12  7
  201412  2 14  8
  201501  0 15  8
  201502  1  9 11
  201503  1 13  9
  201504  0 13  8
  201505  0 10 10
  201506  0 15  4
  201507  0 14  9
  201508  0  9  8
  201509  1  8  8
  201510  0 10 12
  201511  1 16  5
  201512  0 10 10

task 10

지역별로 강수량이 누락된 연월을 표시해주세요.

group_by로 지역별로 그룹핑을 한후, filter(is.na)로 누락된 데이터를 필터링 한다.

climates %>%
    group_by(district) %>%
    filter(is.na(rainfall)) %>%
    select(district, ym)
    district ym    
1   강남구   201401
2   강남구   201405
3   강남구   201410
4   강남구   201504

마지막으로 select로로 구와 연월을 선택 추출한다.

climates %>%
    group_by(district) %>%
    filter(is.na(rainfall)) %>%
    select(district, ym)
    district ym    
1   강남구   201401
2   강남구   201405
3   강남구   201410
4   강남구   201504