-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathR21p-tptheft_dplyr.Rmd
245 lines (169 loc) · 7.63 KB
/
R21p-tptheft_dplyr.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
---
title: "tptheft by dplyr"
author: "Jilung Hsieh"
date: "`r Sys.Date()`"
output: html_document
---
```{r include=FALSE}
knitr::opts_chunk$set(echo=T, cache = T, warning = F, message = FALSE, class.output = "output")
library(tidyverse)
```
# (PART) DATA MANIPULATION {.unnumbered}
# From base R to dplyr {#base2dplyr}
**From base to tidyverse style**
相較於R base的較為傳統的R編程風格,tidyverse style的R programming具有以下幾個特點:
1. 基於tidy data理念:tidyverse style的R programming基於tidy data理念,即資料應該以規律的方式組織,以方便分析和視覺化。tidyverse style的R程式庫提供了一些工具和函數,用於處理和轉換tidy data格式的資料,如dplyr、tidyr等。
2. 使用管道操作符:tidyverse style的R programming通常使用管道操作符(%\>%),將資料通過多個函數連接起來,形成一個清晰和易於理解的資料處理流程。使用管道操作符可以簡化程式碼並提高程式的可讀性。
3. 強調函數庫的一致性:tidyverse style的R programming強調函數庫之間的一致性,即不同函數庫之間使用相似的函數名稱、參數名稱和返回值等,以方便使用者的學習和使用。
4. 使用簡潔的命名方式:tidyverse style的R programming通常使用簡潔和易於理解的變數和函數命名方式,例如使用動詞表示操作,使用名詞表示資料,以方便使用者理解程式碼的含義。
5. 提供高級的視覺化工具:tidyverse style的R programming提供了一些高級的視覺化工具,如ggplot2、gganimate等,可以幫助使用者更加輕鬆地進行資料視覺化和探索。
## Intro. to dplyr
dplyr是一個tidyverse風格的R程式庫,用於對資料進行快速、一致、直觀的操作和轉換。dplyr提供了一些高效能的函數和工具,如`filter`、`select`、`mutate`、`group_by`和`summarize`等,用於對資料進行選擇、篩選、轉換、分組和摘要等操作。
以下是dplyr常用的函數:
1. `filter`:用於選擇符合特定條件的資料列。
2. `select`:用於選擇特定的欄位。
3. `mutate`:用於新增或修改欄位。
4. `group_by`:用於按照特定欄位進行分組。
5. `summarize`:用於對分組後的資料進行摘要統計。
6. `arrange`:用於按照欄位的特定順序進行排序。
dplyr具有以下優點:
1. 簡潔而直觀的語法:dplyr的函數名稱和語法都十分簡潔而直觀,易於使用和理解,尤其對於新手來說更加友好。
2. 高效的運行速度:dplyr的設計考慮了資料處理的效率,使用C++實現了部分函數,因此dplyr在處理大型資料集時運行速度較快。
3. 與tidyverse相容:dplyr與其他tidyverse程式庫,如ggplot2和tidyr,可以很好地相容,並且能夠與其他常用的R程式庫進行集成,提供更加全面和高效的資料分析和可視化工具。
## R base version {#tptheft_dplyr}
```{r}
library(tidyverse)
# options(stringsAsFactors = F) # default options in R ver.> 4.0
library(readr)
df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
df$time <- df$發生時段
df$region <- substr(df$發生地點, 4, 5)
df <- df[!df$time %in% c("03~05", "05~07", "09~11", "11~13", "11~03", "12~15", "15~17", "15~18", "17~19", "18~21", "19~21", "21~23", "21~24", "23~01"), ]
(res_table <- table(df$time, df$region))
colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
'#E79460', '#E98B2A', '#9B6E23', '#F7C242',
'#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
# par(family=('STKaiti'))
par(family=('Heiti TC Light'))
mosaicplot(res_table, color=colors, border=0, off = 3,
main="Theft rate of Taipei city (region by hour)")
```
## dplyr version
### Cleaning data I
- Renaming variables by `select()`
- Generating variable year by `mutate()`
- Generating variable month by `mutate()`
- Retrieving area by `mutate()`
#### (1) Without pipeline I
```{r}
library(readr)
df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
# Using select() to select and rename variable
# assign to df1
# df1 <- #YOUR CODE HERE
# mutate() to add a new variable year,
# assign to df2
# df2 <- #YOUR CODE HERE
# mutate() to add new variable month,
# assign to df3
# df3 <- #YOUR CODE HERE
# mutate() a new variable area by stringr::str_sub()
# assign to df4
# df4 <- #YOUR CODE HERE
# mutate() a new variable county by stringr::str_sub()
# assign to selected_df
# selected_df <- #YOUR CODE HERE
```
#### (2) Without pipeline II
Using `select()` and `mutate()` to modify `selected_df` and replace the original `selected_df`.
```{r}
library(stringr)
df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
selected_df <- select(df, id = 編號, cat = 案類, date = `發生日期`, time = `發生時段`, location = `發生地點`)
# YOUR CODE HERE
```
#### (3) With pipeline
```{r}
library(stringr)
selected_df <- df %>%
# YOUR CODE HERE
```
### Cleaning data II
- Filtering out irrelevant data records
```{r}
# readr::guess_encoding("data/tp_theft.csv")
filtered_df <- selected_df %>%
# count(year) %>% View
filter(county == "臺北市") %>%
filter(year >= 104) %>%
# count(time) %>% View
# count(location) %>%
filter(!area %in% c("中和市", "板橋市"))
```
### Long to wide form
- `count()` two variables
- `pivot_wider()` spread one variable as columns to wide form
```{r}
# count() then pivot_wider()
df.wide <- filtered_df %>%
count(time, area) %>%
pivot_wider(names_from = area, values_from = n, values_fill = 0)
??pivot_wider
```
### Setting time as row.name for mosaicplot
```{r}
row.names(df.wide) <- df.wide$time
df.wide$time <- NULL
```
```{r warning=FALSE}
# Specify fonts for Chinese
# par(family=('STKaiti'))
par(family=('Heiti TC Light')) # for mac
# Specify colors
colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
'#E79460', '#E98B2A', '#9B6E23', '#F7C242',
'#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
# mosaicplot()
mosaicplot(df.wide, color=colors, border=0, off = 3,
main="Theft rate of Taipei city (region by hour)")
```
### Clean version
```{r}
library(readr)
# options(stringsAsFactors = F)
df <- read_csv("data/臺北市住宅竊盜點位資訊-UTF8-BOM-1.csv")
selected_df <- df %>%
select(id = 編號,
cat = 案類,
date = `發生日期`,
time = `發生時段`,
location = `發生地點`) %>%
mutate(year = date %/% 10000) %>%
mutate(month = date %/% 100 %% 100) %>%
mutate(area = stringr::str_sub(location, 4, 6)) %>%
mutate(county = stringr::str_sub(location, 1, 3))
selected_df %>% count(year)
selected_df %>% count(time) %>% head(10)
selected_df %>% arrange(time) %>% head(10)
filtered_df <- selected_df %>%
# count(year) %>% View
filter(year >= 104) %>%
filter(!time %in% c("03~05", "05~07", "09~11", "11~13", "15~17", "17~19", "18~21", "21~23", "23~01"))
# count(time) %>% View
# count(location) %>%
# filter(!area %in% c("中和市", "板橋市"))
df.wide <- filtered_df %>%
count(time, area) %>%
pivot_wider(names_from = area, values_from = n, values_fill = 0) %>%
as.data.frame()
row.names(df.wide) <- df.wide$time
df.wide$time <- NULL
par(family=('Heiti TC Light')) # for mac
# Specify colors
colors <- c('#D0104C', '#DB4D6D', '#E83015', '#F75C2F',
'#E79460', '#E98B2A', '#9B6E23', '#F7C242',
'#BEC23F', '#90B44B', '#66BAB7', '#1E88A8')
# mosaicplot()
mosaicplot(df.wide, color=colors, border=0, off = 3,
main="Theft rate of Taipei city (region by hour)")
```