1 Preparations


1.1 Load libraries

library(dplyr)
library(ggplot2)

1.2 Load data

midwest <- as.data.frame(ggplot2::midwest)
head(midwest)
##   PID    county state  area poptotal popdensity popwhite popblack
## 1 561     ADAMS    IL 0.052    66090  1270.9615    63917     1702
## 2 562 ALEXANDER    IL 0.014    10626   759.0000     7054     3496
## 3 563      BOND    IL 0.022    14991   681.4091    14477      429
## 4 564     BOONE    IL 0.017    30806  1812.1176    29344      127
## 5 565     BROWN    IL 0.018     5836   324.2222     5264      547
## 6 566    BUREAU    IL 0.050    35688   713.7600    35157       50
##   popamerindian popasian popother percwhite  percblack percamerindan
## 1            98      249      124  96.71206  2.5752761     0.1482826
## 2            19       48        9  66.38434 32.9004329     0.1788067
## 3            35       16       34  96.57128  2.8617170     0.2334734
## 4            46      150     1139  95.25417  0.4122574     0.1493216
## 5            14        5        6  90.19877  9.3728581     0.2398903
## 6            65      195      221  98.51210  0.1401031     0.1821340
##    percasian  percother popadults  perchsd percollege percprof
## 1 0.37675897 0.18762294     43298 75.10740   19.63139 4.355859
## 2 0.45172219 0.08469791      6724 59.72635   11.24331 2.870315
## 3 0.10673071 0.22680275      9669 69.33499   17.03382 4.488572
## 4 0.48691813 3.69733169     19272 75.47219   17.27895 4.197800
## 5 0.08567512 0.10281014      3979 68.86152   14.47600 3.367680
## 6 0.54640215 0.61925577     23444 76.62941   18.90462 3.275891
##   poppovertyknown percpovertyknown percbelowpoverty percchildbelowpovert
## 1           63628         96.27478        13.151443             18.01172
## 2           10529         99.08714        32.244278             45.82651
## 3           14235         94.95697        12.068844             14.03606
## 4           30337         98.47757         7.209019             11.17954
## 5            4815         82.50514        13.520249             13.02289
## 6           35107         98.37200        10.399635             14.15882
##   percadultpoverty percelderlypoverty inmetro category
## 1        11.009776          12.443812       0      AAR
## 2        27.385647          25.228976       0      LHR
## 3        10.852090          12.697410       0      AAR
## 4         5.536013           6.217047       1      ALU
## 5        11.143211          19.200000       0      AAR
## 6         8.179287          11.008586       0      AAR
str(midwest)     # 437개 관측치, 28개 변수
## 'data.frame':    437 obs. of  28 variables:
##  $ PID                 : int  561 562 563 564 565 566 567 568 569 570 ...
##  $ county              : chr  "ADAMS" "ALEXANDER" "BOND" "BOONE" ...
##  $ state               : chr  "IL" "IL" "IL" "IL" ...
##  $ area                : num  0.052 0.014 0.022 0.017 0.018 0.05 0.017 0.027 0.024 0.058 ...
##  $ poptotal            : int  66090 10626 14991 30806 5836 35688 5322 16805 13437 173025 ...
##  $ popdensity          : num  1271 759 681 1812 324 ...
##  $ popwhite            : int  63917 7054 14477 29344 5264 35157 5298 16519 13384 146506 ...
##  $ popblack            : int  1702 3496 429 127 547 50 1 111 16 16559 ...
##  $ popamerindian       : int  98 19 35 46 14 65 8 30 8 331 ...
##  $ popasian            : int  249 48 16 150 5 195 15 61 23 8033 ...
##  $ popother            : int  124 9 34 1139 6 221 0 84 6 1596 ...
##  $ percwhite           : num  96.7 66.4 96.6 95.3 90.2 ...
##  $ percblack           : num  2.575 32.9 2.862 0.412 9.373 ...
##  $ percamerindan       : num  0.148 0.179 0.233 0.149 0.24 ...
##  $ percasian           : num  0.3768 0.4517 0.1067 0.4869 0.0857 ...
##  $ percother           : num  0.1876 0.0847 0.2268 3.6973 0.1028 ...
##  $ popadults           : int  43298 6724 9669 19272 3979 23444 3583 11323 8825 95971 ...
##  $ perchsd             : num  75.1 59.7 69.3 75.5 68.9 ...
##  $ percollege          : num  19.6 11.2 17 17.3 14.5 ...
##  $ percprof            : num  4.36 2.87 4.49 4.2 3.37 ...
##  $ poppovertyknown     : int  63628 10529 14235 30337 4815 35107 5241 16455 13081 154934 ...
##  $ percpovertyknown    : num  96.3 99.1 95 98.5 82.5 ...
##  $ percbelowpoverty    : num  13.15 32.24 12.07 7.21 13.52 ...
##  $ percchildbelowpovert: num  18 45.8 14 11.2 13 ...
##  $ percadultpoverty    : num  11.01 27.39 10.85 5.54 11.14 ...
##  $ percelderlypoverty  : num  12.44 25.23 12.7 6.22 19.2 ...
##  $ inmetro             : int  0 0 0 1 0 0 0 0 0 1 ...
##  $ category            : chr  "AAR" "LHR" "AAR" "ALU" ...

2 강의 순서


  1. dplyr 복습
  2. dplyr 심화
  3. dplyr 문제 풀기
  4. rmarkdown 배우기
  5. rpubs에 문서 올리기

3 dplyr 복습


dplyr 함수 기능
filter() 행 추출
select() 열(변수) 추출
arrange() 정렬
mutate() 변수 추가
summarise() 통계치 산출
group_by() 집단별로 나누기
left_join() 데이터 합치기(열)
bind_rows() 데이터 합치기(행)

4 dplyr 심화


https://cran.r-project.org/web/packages/dplyr/dplyr.pdf

4.1 dplyr의 _at, _all, _if 함수들

base package data : iris(총 5개의 변수들과 150개의 관측치)

knitr::kable(head(iris))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa

4.1.1 summarise_at()

다음의 결과를 나오게 하는 코드를 설명해보시오.

data <- iris %>% 
  group_by(Species) %>% 
  summarise(min.sl = min(Sepal.Length),
            max.sl = max(Sepal.Length),
            mean.sl = mean(Sepal.Length),
            median.sl = median(Sepal.Length),
            min.sw = min(Sepal.Width),
            max.sw = max(Sepal.Width),
            mean.sw = mean(Sepal.Width),
            median.sw = median(Sepal.Width))

knitr::kable(head(data))
Species min.sl max.sl mean.sl median.sl min.sw max.sw mean.sw median.sw
setosa 4.3 5.8 5.006 5.0 2.3 4.4 3.428 3.4
versicolor 4.9 7.0 5.936 5.9 2.0 3.4 2.770 2.8
virginica 4.9 7.9 6.588 6.5 2.2 3.8 2.974 3.0

but, summarise_at을 사용하면 코드가 간단해진다.

data <- iris %>% 
  group_by(Species) %>% 
  summarise_at(vars(Sepal.Length, Sepal.Width), funs(min, max, mean, median))

knitr::kable(head(data))
Species Sepal.Length_min Sepal.Width_min Sepal.Length_max Sepal.Width_max Sepal.Length_mean Sepal.Width_mean Sepal.Length_median Sepal.Width_median
setosa 4.3 2.3 5.8 4.4 5.006 3.428 5.0 3.4
versicolor 4.9 2.0 7.0 3.4 5.936 2.770 5.9 2.8
virginica 4.9 2.2 7.9 3.8 6.588 2.974 6.5 3.0

4.1.2 summarise_all()

all과 at의 차이는 ?!

data <- iris %>% 
  group_by(Species) %>% 
  summarise_all(funs(mean))

knitr::kable(head(data))
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026

모든 변수에 대해서 적용된다.

data <- iris %>% 
  group_by(Species) %>% 
  summarise_all(funs(mean, median))

knitr::kable(head(data))
Species Sepal.Length_mean Sepal.Width_mean Petal.Length_mean Petal.Width_mean Sepal.Length_median Sepal.Width_median Petal.Length_median Petal.Width_median
setosa 5.006 3.428 1.462 0.246 5.0 3.4 1.50 0.2
versicolor 5.936 2.770 4.260 1.326 5.9 2.8 4.35 1.3
virginica 6.588 2.974 5.552 2.026 6.5 3.0 5.55 2.0

4.1.3 summarise_if()

predicate : ~라고 단정하다

data <- iris %>% 
  group_by(Species) %>% 
  summarise_if(is.numeric, mean)

knitr::kable(head(data))
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026
data <- iris %>% 
  group_by(Species) %>% 
  summarise_if(is.character, mean)

knitr::kable(head(data))
Species
setosa
versicolor
virginica

4.1.4 정규표현식

정규표현식(正規表現式, Regular Expression)은 문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 ’검색’하거나 ’치환’하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단이다.

위의 summarise_at에서 사용한 iris의 변수명은 Sepal로 시작한다.

colnames(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"

이를 이용하여 start_with()라는 함수를 쓰면 다음과 같이 표현할 수 있다.

data <- iris %>% 
  group_by(Species) %>% 
  summarise_at(vars(starts_with("Sepal")), funs(min, max, mean, median))

knitr::kable(head(data))
Species Sepal.Length_min Sepal.Width_min Sepal.Length_max Sepal.Width_max Sepal.Length_mean Sepal.Width_mean Sepal.Length_median Sepal.Width_median
setosa 4.3 2.3 5.8 4.4 5.006 3.428 5.0 3.4
versicolor 4.9 2.0 7.0 3.4 5.936 2.770 5.9 2.8
virginica 4.9 2.2 7.9 3.8 6.588 2.974 6.5 3.0

위와 같이 select(), summarise_at(), mutate_at()에 쓸 수 있는 유용함 함수들은 다음과 같다.

함수 설명
starts_with(x) x로 시작하는 변수만 선택, ignore.case = TRUE를 추가하면 대소문자를 구별하지 않음
ends_with(x) x로 끝나는 변수만 선택
contains(x) x를 포함하는 변수를 선택
matches(x) 정규표현 x에 대응하는 변수 선택
num_range(“x”, 1:5, width = 2) 문자열과 숫자의 조합으로 변수 선택. width는 앞에 0을 붙인 자리수.
one_of(“x”, “y”, “z”) “x”, “y”, “z” 중 어느 하나라도 해당하는 변수를 선택
everything 모든 변수를 선택

5 dplyr 문제 풀기


미국 동북중부 437개 지역의 인구통계 정보를 담고 있는 ‘midwest’ 데이터를 사용해 데이터 분석 문제를 해결해 보세요.
midwest는 ggplot2 패키지에 들어 있습니다.

Q1. popadults는 해당 지역의 성인 인구, poptotal은 전체 인구를 나타냅니다.
midwest 데이터에 전체 인구 대비 미성년 인구 백분율 변수를 추가하세요.

midwest1 <- midwest %>% 
  mutate(popkid = (poptotal - popadults)/(poptotal)*100)

knitr::kable(head(midwest1))

Q2. 미성년 인구 백분율이 가장 높은 상위 5개 county(지역)의 미성년 인구 백분율을 출력하세요.

midwest2 <- midwest1 %>% 
  select(county, popkid) %>%
  arrange(desc(popkid)) %>%     # arrange랑 select 순서 바꿔도 동일
  head(5)

knitr::kable(head(midwest2))

Q3. 분류표의 기준에 따라 미성년 비율 등급 변수를 추가하고, 각 등급에 몇 개의 지역이 있는지
알아보세요.

분류 기준
large 40% 이상
middle 30 ~ 40% 미만
small 30% 미만
midwest3 <- midwest1 %>% 
  mutate(popkidclass = ifelse(popkid >= 40, "large",
                              ifelse(popkid >= 30, "middle", "small"))) %>% 
  group_by(popkidclass) %>% 
  summarise(n = n())

knitr::kable(head(midwest3))

Q4. popasian은 해당 지역의 아시아인 인구를 나타냅니다. 전체 인구 대비 아시아인 인구 백분율 변수를 추가하고 하위 10개 지역의 state(주), county(지역), 아시아인 인구 백분율을 출력하세요.

midwest4 <- midwest1 %>% 
  mutate(popasiantotal = (popasian / poptotal)*100) %>% 
  arrange(popasiantotal) %>% 
  select(state, county, popasiantotal)

knitr::kable(head(midwest4, 10))