---
title: "数据预处理"
author: "天良"
date: "`r Sys.Date()`"
output:
html_document:
toc: true
toc_float:
collapsed: false
smooth_scroll: false
number_sections: true
fig_width: 15
fig_height: 12
fig_caption: true
df_print: paged
classoption: "hyperref,"
---
```{r echo=F, include=F}
knitr::opts_chunk$set(
message = F,
warning = F,
cache = T,
fig.show = "hold"
)
options(knitr.kable.NA = ' - ')
library(tidyverse) # 使用管道操作符、readr包中的函数
library(lubridate)
library(forcats)
library(knitr)
library(kableExtra) # 绘制带格式表格
library(DMwR2) # 用于加载该项目数据集algae及其中的一些数据处理函数
library(mice) # 用于缺失值填充
library(CORElearn) # 用于变量选择
library(sampling) # 用于分层抽样
library(DBI) # 用于连接数据库
library(RMySQL) # 用于连接数据库MySQL
library(Boruta) # 用于特征选择
```
# 整理数据-数据结构变换
使用tidyr包中的gather(宽变长)和spread(长变宽)实现数据结构变换。
## 宽格式数据转换为长格式
### 准备数据集
```{r}
anthoming <- gcookbook::anthoming
# 将数据集以表格化展示
kable(anthoming, format = "html", align = "c") %>%
kable_styling(position = "center")
```
### 将宽格式数据变为长格式数据
```{r}
anthoming %>%
gather(key = "condition", value = "count", expt:ctrl) %>%
kable(format = "html", align = "c") %>%
kable_styling(position = "center")
```
## 长格式数据转换为宽格式
### 准备数据集
```{r}
plum <- gcookbook::plum
# 将数据集以表格化展示
kable(plum, format = "html", align = "c") %>%
kable_styling(position = "center")
```
### 将长格式数据转换为宽格式数据
```{r}
plum %>%
spread(survival, count) %>%
kable(format = "html", align = "c") %>%
kable_styling(position = "center")
```
# 处理日期
使用lubridate包中的相关函数处理日期数据,如ymd、as.period、interval。
## 将日期字符串转换为日期数据
```{r}
ymd(c("2018-10-10","181010","2018/10/10")) %>%
kable(format = "html", align = "c", col.names = "") %>%
kable_styling(position = "center")
```
## 日期计算
### 计算两个日期之间相隔的年份
假如有一个人,出生日期为1987年1月1日,那么截止2018年8月1日,他`r year(as.period(interval(ymd("1987/1/1"), ymd("2018-8-1"))))`岁。
```{r}
# 计算截止2018年8月1日时他的年龄
year(as.period(interval(ymd("1987/1/1"), ymd("2018-8-1"))))
```
### 计算两个日期之间相隔的月份
假如有一个人,于2000年3月15日进公司,那么截止2018年8月1日,他在该公司的工龄为`r year(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1"))))`年`r month(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1"))))`个月,合计`r year(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1")))) * 12 + month(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1"))))`个月。
```{r}
# 计算工龄年
work_age_by_year_y <- year(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1"))))
# 计算工龄余下的月
work_age_by_year_m <- month(as.period(interval(ymd("2000/3/15"), ymd("2018-8-1"))))
# 计算工龄合计月
work_age_by_month <- work_age_by_year_y * 12 + work_age_by_year_m
t <- tribble(
~工龄年, ~工龄月, ~工龄合计月,
work_age_by_year_y, work_age_by_year_m, work_age_by_month
)
t %>%
kable(format = "html", align = "c") %>%
kable_styling(position = "center")
```