library(dplyr)
library(ggplot2)
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" ...
- dplyr 복습
- dplyr 심화
- dplyr 문제 풀기
- rmarkdown 배우기
- rpubs에 문서 올리기
dplyr 함수 | 기능 |
---|---|
filter() | 행 추출 |
select() | 열(변수) 추출 |
arrange() | 정렬 |
mutate() | 변수 추가 |
summarise() | 통계치 산출 |
group_by() | 집단별로 나누기 |
left_join() | 데이터 합치기(열) |
bind_rows() | 데이터 합치기(행) |
https://cran.r-project.org/web/packages/dplyr/dplyr.pdf
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 |
다음의 결과를 나오게 하는 코드를 설명해보시오.
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 |
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 |
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 |
정규표현식(正規表現式, 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 | 모든 변수를 선택 |
미국 동북중부 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))