数据预处理
2018-08-31
2018-08-31
数据预处理
1 数据读取
通过R将外部数据导入,读取cardata数据命名为data。
data=read.csv("F:/cardata.csv", stringsAsFactors=F) # 导入数据
str(data) # 浏览data的存储类型和结构信息
## 'data.frame': 799 obs. of 7 variables:
## $ V1: chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ V2: chr "卖家报价:¥8.50万" "卖家报价:¥23.80万" "卖家报价:¥9.50万" "卖家报价:¥26.50万" ...
## $ V3: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ V4: chr "8.13万公里" "3.56万公里" "1.61万公里" "3.85万公里" ...
## $ V5: chr "国四" "国四" "国四" "国五" ...
## $ V6: chr " 1.4L 排量 " " 2.0L 排量 " " 1.8L 排量 " " 1.6L 排量 " ...
## $ V7: chr "厂商新车指导价:14.79万" "厂商新车指导价:36.98万" "厂商新车指导价:10.98万" "厂商新车指导价:28.98万" ...
查看数据cardata的结构,观察到数据不规整,涉及变量名定义不清晰,数据的元素存在特殊符号,以及带有量纲等。数据质量较差,因此统计分析前需要对数据进行清洗。例如:“卖家报价¥8.50万”需要去掉中文汉字、符号;带有符号“¥”的需要进行去除;单位:“万”的内容需要去掉单位,以及变量类型需要转换。最终通过对数据进行格式化处理,得到可以用来统计分析的数据。
dim(data) # 查看变量维度
## [1] 799 7
通过查看变量维度得cardata数据有7个变量,含有799条数据。
2 数据变量重命名
将数据列中信息进行一定的概括,能够更好地对数据变量进行重命名,使得对该列数据可以进行更好的认知、分析。以数据元素中概括的字段信息进行命名,命名时也可根据变量位置进行命名。如下所示:
1)序号位置命名
names(data)[1]=("车名") # 变量重命名
names(data)[2]=("卖家报价")
names(data)[3]=("上牌时间")
names(data)[4]=("车程")
names(data)[5]=("排放标准")
names(data)[6]=("排量")
names(data)[7]=("原价")
str(data)
## 'data.frame': 799 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: chr "卖家报价:¥8.50万" "卖家报价:¥23.80万" "卖家报价:¥9.50万" "卖家报价:¥26.50万" ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : chr "8.13万公里" "3.56万公里" "1.61万公里" "3.85万公里" ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : chr " 1.4L 排量 " " 2.0L 排量 " " 1.8L 排量 " " 1.6L 排量 " ...
## $ 原价 : chr "厂商新车指导价:14.79万" "厂商新车指导价:36.98万" "厂商新车指导价:10.98万" "厂商新车指导价:28.98万" ...
通过变量的序号位置进行命名,将变量涉及的位置内容进行更改。
2)rename函数命名
library(plyr) # 加载plyr包(用来重命名变量名)
data=rename(data,c(V1="车名",V2="卖家报价",V3="上牌时间",V4="车程",V5="排放标准",V6="排量",V7="原价")) # rename函数变量重命名
## The following `from` values were not present in `x`: V1, V2, V3, V4, V5, V6, V7
names(data) # 查看rename函数命名后的变量名称
## [1] "车名" "卖家报价" "上牌时间" "车程" "排放标准" "排量"
## [7] "原价"
str(data)
## 'data.frame': 799 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: chr "卖家报价:¥8.50万" "卖家报价:¥23.80万" "卖家报价:¥9.50万" "卖家报价:¥26.50万" ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : chr "8.13万公里" "3.56万公里" "1.61万公里" "3.85万公里" ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : chr " 1.4L 排量 " " 2.0L 排量 " " 1.8L 排量 " " 1.6L 排量 " ...
## $ 原价 : chr "厂商新车指导价:14.79万" "厂商新车指导价:36.98万" "厂商新车指导价:10.98万" "厂商新车指导价:28.98万" ...
通过加载包“plyr”,以rename函数形式对全部变量进行重命名。
3 数据的替换
变量重命名后可以观察一下数据。例如,报价、车程、排量、原价等,结合生活实际一般为数值型,就需要利用R对该变量类型进行修改。
数据元素信息替换函数是gsub,基本函数规则为:
data$ 变量=gsub(“变量里包含的文字”,“”,data$变量)
data$卖家报价=gsub("卖家报价:¥","",data$卖家报价)# 报价一般为数值型数据,该数据中卖家报价含有单位“万”
data$卖家报价=gsub("万","",data$卖家报价)
data$车程=gsub("万公里","",data$车程)
data$排量=gsub("L 排量","",data$排量)# 排量为数值型数据,单位:L
data$原价=gsub("厂商新车指导价:","",data$原价) # 原价为数值型数据,单位:万
data$原价=gsub("万","",data$原价) # 原价为数值型数据,单位:万
str(data)
## 'data.frame': 799 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: chr "8.50" "23.80" "9.50" "26.50" ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : chr "8.13" "3.56" "1.61" "3.85" ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : chr " 1.4 " " 2.0 " " 1.8 " " 1.6 " ...
## $ 原价 : chr "14.79" "36.98" "10.98" "28.98" ...
用gsub函数对数据进行处理,替换不符合逻辑的数据。以变量名“排量”进行说明,如下所示:
data$ 排量=gsub(“L 排量”,“”,data$排量)
先提取data数据的“排量”和数据里原来所包含的“L”,替换为空白,就能得到干净的排量数据。
替换后,继续观察数据,看看各变量之间的存储类型。
4 数据类型更改
什么是存储类型呢?由于不同类型的数据在计算机所需的存储字节不同,因此将R对象类型分为“数值型”、“字符串型”、“逻辑性”等。为了便于统计分析,数据类型的存储结构需要统一。
观察数据得出变量“车名”是字符串型数据,卖家报价、车程、排量、原价是数值型数据,那么如何改变数据类型呢?如下所示:
data$排量=as.numeric(data$排量) # 将排量改为数值型数据
data$卖家报价=as.numeric(data$卖家报价) # 将卖家报价改为数值型数据
data$车程=as.numeric(data$车程)
data$原价=as.numeric(data$原价)
str(data) # 浏览对象data的存储类型和结构信息
## 'data.frame': 799 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: num 8.5 23.8 9.5 26.5 5.1 7.8 7.3 17.1 3.95 5.2 ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : num 8.13 3.56 1.61 3.85 9.2 6.59 4.3 9.3 6.2 0.8 ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : num 1.4 2 1.8 1.6 1.8 1.6 2 2 1.5 1.5 ...
## $ 原价 : num 14.8 37 11 29 14.9 ...
由于排量涉及到数量,定义为数值型数据;卖家报价是指的单价,和数值有关,将卖家报价改为数值型数据。车程、原价等改为数值型数据。
5 数据缺失值删除
1)complete.cases函数删除
通过str()得到数据的结构信息,数据共有799条,且含有缺失值数据,那么如何删除缺失值数据呢?
为逐个判断每个观测样本是否有取缺失值的变量(域),需要用complete.cases函数,
基本函数规则为:complete.cases(矩阵名或数据框名)
data=data[complete.cases(data),] ##删除含有缺失值的数据
str(data)
## 'data.frame': 792 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: num 8.5 23.8 9.5 26.5 5.1 7.8 7.3 17.1 3.95 5.2 ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : num 8.13 3.56 1.61 3.85 9.2 6.59 4.3 9.3 6.2 0.8 ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : num 1.4 2 1.8 1.6 1.8 1.6 2 2 1.5 1.5 ...
## $ 原价 : num 14.8 37 11 29 14.9 ...
由以上数据得知,数据量现有792条,共删除了7条缺失值数据
2)na.omit函数删除
na.omit函数的处理方式是采纳完整观测样本,剔除不完整观测。
基本函数规则为:na.omit(矩阵名或数据框名)
data=na.omit(data) ##删除所有含有缺失值的数据
str(data)
## 'data.frame': 792 obs. of 7 variables:
## $ 车名 : chr "大众-朗逸 2013款 改款 1.4TSI DSG舒适版" "奥迪-A4L 2013款 35 TFSI 自动技术型" "纳智捷-优6 SUV 2016款 1.8T 风尚超值型" "奔驰-GLA 2016款 GLA 200 时尚型" ...
## $ 卖家报价: num 8.5 23.8 9.5 26.5 5.1 7.8 7.3 17.1 3.95 5.2 ...
## $ 上牌时间: chr "2013年10月" "2014年4月" "2016年8月" "2016年4月" ...
## $ 车程 : num 8.13 3.56 1.61 3.85 9.2 6.59 4.3 9.3 6.2 0.8 ...
## $ 排放标准: chr "国四" "国四" "国四" "国五" ...
## $ 排量 : num 1.4 2 1.8 1.6 1.8 1.6 2 2 1.5 1.5 ...
## $ 原价 : num 14.8 37 11 29 14.9 ...
6 数据导出
经过数据清洗后,加工好的数据就可进行保存下来,那么如何将清洗的数据保存下来呢?以数据保存为csv和txt文件为例,说明如下:
1)保存为txt文件
数据保存为文本格式需要用的函数为write.table,基本函数规则为:
write.table(数据对象名,“要保存的盘:/保存到盘里的文件名称/文件名.txt”)
write.table(data,"D:/Task/2R语言基础/导出data.txt")
在设置的指定工作路径下,就能查询到导出的数据。
2)保存为csv格式
数据保存为csv格式需用的函数是write.csv函数,基本函数规则为:
write.csv(数据对象名,“要保存的盘:/保存到盘里的文件名称/文件名.csv”)
write.csv(data,"D:/Task/2R语言基础/导出data.csv")