数据预处理

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")