学习本节课,你可以:
- 学会如何构建新的字段
- 学会如何进行字段类型转换
- 学会如何实现数据透视表转换
一、几个重要知识点:
- tidyr中的spread()和gathr()函数介绍
用于将数据展开和合并,类似excel中的数据透视功能
#install.packages('dplyr')
library(dplyr)
data <- data_frame(区域= c('浦东','浦东','黄浦','黄浦','徐汇','徐汇'),
年份= c(2000,2001,2000,2001,2000,2001),
均价= c(58139,59663,86019,88684,81616,87725))
data_spread <- data %>% spread(key = 年份, value = 均价)
data_gather <- data_spread %>% gather(`2000`,`2001`,key = 年份, value = 均价)
- dplyr中的mutate()函数介绍
用于构建新的字段
#install.packages('dplyr')
library(dplyr)
data <- data_frame(区域= c('浦东','浦东','黄浦','黄浦','徐汇','徐汇'),
年份= c(2000,2001,2000,2001,2000,2001),
均价= c(58139,59663,86019,88684,81616,87725))
data_mutate <- data %>% mutate(均价_万元 = 均价 / 1000)
二、原始数据及目标数据格式
原始小区数据中,我们有每个小区的单价,我希望获得2000年-2010年每个区的小区均价的交叉数据汇总,大家可以结合之前学过的知识点思考下,如何处理?
- 原始数据如下:
xiaoqu.csv
5.4M
·
百度网盘
- 目标数据如下:
三、文件中的几个坑
- 小区年份和小区单价中既有数字又有中文(如“未知”和“暂无”),如何转化成数字?
答:用dplyr包中的mutate()函数构建新的字段,用as.numeric()函数转换成字符类型(中文字符自动转换为空值),即:mutate(xiaoqu_price_new = as.numeric(xiaoqu_price), xiaoqu_year_new = as.numeric(xiaoqu_year))
- 分组汇总时,有空值,如何处理?
答:(,na.rm=T)可以无视空值进行均值计算,即:group_by(xiaoqu_district,xiaoqu_year) %>% summarise(均价 = mean(xiaoqu_price_new,na.rm = T))
- 如何整理成数据透视表的格式?
答:用tidyr包中的spread()函数可以将表转换为数据透视表格式(目标格式)
四、实现代码
library(tidyr)
library(dplyr)
library(readr)
#读取xiaoqu.csv文件,注意编码格式加入locale = locale(encoding = "GB18030"),避免出现乱码
xiaoqu_data <- read_csv('D:/从0到1学习数据科学/xiaoqu.csv', locale = locale(encoding = "GB18030"))
tidy_data <- xiaoqu_data %>%
#构建新字段,用as.numeric()方法进行字符转换
mutate(xiaoqu_price_new = as.numeric(xiaoqu_price),
xiaoqu_year_new = as.numeric(xiaoqu_year)) %>%
#过滤空价格以及年份在2000至2010年的数据
filter(!is.na(xiaoqu_price_new)) %>%
filter(xiaoqu_year_new %>% between(2000,2010)) %>%
#汇总和聚合,获取小区年份的均价
group_by(xiaoqu_district,xiaoqu_year) %>%
summarise(均价 = mean(xiaoqu_price_new,na.rm = T)) %>%
#扩展成数据透视表形式
spread(key = xiaoqu_year,value = 均价)
数据处理课程:
有马骏:第0课:一个周末学会R语言数据处理:从数据库到数仓再到数据集市zhuanlan.zhihu.com数据采集课程:
有马骏:第0课:一个周末学会R语言数据采集:数据从哪里来?zhuanlan.zhihu.com