数据下载:http://www.fueleconomy.gov/feg/epadata/vehicles.csv.zip
将数据导入R中,
1.首先将工作路径设定到本地保存了vehicles.csv的路径下:
setwd("path")
2.我们可以直接从zip文件中载入数据,只要你知道zip中压缩的文件名:
vehicles<-read.csv(unz("vehicles.csv.zip","vehicles.csv"),stringsAsFactors = F)
这里用到了参数stringAsFactors=F.R默认会将字符串转为因子。因子是R中定性变量的称呼,可以被认为对数据的标注或者标签。在R的内部,因子是存为整数的,每个整数映射到因子的一个水平。这项技术可以使得老版本R的存储成本降低。
一般而言定性变量是没有顺序的。然而也存在有顺序的分类变量,在统计学中也被称为序数。序数也是一种分类变量
3.为了检查数据是否已经载入,我们可以在R中展现头几行,使用如下代码:
head(vehicles)
4.查看数据有多少行
nrow(vehicles)
5.查看有多少个变量(列)
ncol(vehicles)
6.查看各列的含义,用name()函数
names(vehicles)
7.我们可以看到数据集中包含几年的数据,只需要计算year这一列的不同取值的向量,然后计算这个向量的长度即可
length(unique(vehicles[,"year"]))
8.使用max和min函数
first_year<-min(vehicles[,"year"]) last_year<-max(vehicles[,"year"])
9.找出燃料类型有哪些
table(vehicles$fuelType1)
10.探索一下这些汽车使用的传动方式,首先把缺失值用NA填补
vehicles$trany[vehicles$trany==""]<-NA
11.现在trany这一列是文本,我们仅仅关注车辆的传动方式是自动还是手动。因此我们使用substr函数提取trany的值的前四个字符,然后确定这个是自动还是手动。我们生成一个新的变量:trany2
vehicles$trany2<-ifelse(substr(vehicles$trany,1,4)=="Auto","Auto","Manual")
10.我们将这个新变量变成因子,然后使用table函数来看不同类型传动方式的记录各有多少
vehicles$trany<-as.factor(vehicles$trany) table(vehicles$trany2)
学习了如何快速浏览R中的数据。最明显的是,使用table函数来观察fuelType1这个变量不同取值所对应的记录数。这个函数其实还有很多其他用途,比如计算交叉列联表等
with(vehicles,table(sCharger,year))
这里使用了with命令。这个命令告诉R使用vehicles数据集作为接下来命令的默认数据集。在这个例子中,接下来将用table函数。因此,我们可以直接用变量sCharger和year,而不必再使用美元符号和数据框名称组合来引用了。
我们可以使用class查看变量的类型:
class(vehicles$sCharger)
进一步分析汽车燃料效率数据
接下来用plyr和ggplot2来探索数据集
1.首先,我们看看平均MPG是否随着时间有一个趋势上的变化。为此,我们使用plyr包的ddply函数来操作vehicles数据集,按年份整合,然后对每个组计算highway、city和combine的燃油效率。这个结果将赋值给一个新的数据框:mpgByYr
library(plyr)
mpgByYr<-ddply(vehicles,~year,summarise,avgMPG=mean(comb08),avgHghy=mean(highway08),avgCity=mean(city08))
2.为了对新的数据框得到一个更好的理解,我们将它传入ggplot函数中,用散点图绘制avgMPG和year之间的关系。此外,我们还会标明我们需要的坐标轴的命名、图的标题,一级加上一个平滑的条件均值,geom_smooth()在图片上增加一个阴影的区域。
ggplot(mpgByYr,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("All cars")
3.我们只看燃油车,虽然非燃油车数量并不多。为了做到这个,我们使用subset函数来生成一个新的数据框:gasCars.这个数据框只包含fuelType1的取值为如下取值的记录。
gasCars<-subset(vehicles,fuelType1 %in% c("Regular Gasoline","Premium Gasoline","Midgrade Gasoline")&fuelType2==""&atvType!="Hybrid") mpgByYr_Gas<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08)) ggplot(mpgByYr_Gas,aes(year,avgMPG))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average MPG")+ggtitle("Gasoline cars")
4.我们注意变量displ,表示引擎的排量,单位为升。现在他还是字符串类型,我们需要把他变为数值型
typeof(gasCars$displ) gasCars$displ<-as.numeric(gasCars$displ) ggplot(gasCars,aes(displ,comb08))+geom_point()+geom_smooth()
5.现在,让我们看看是否近年生产了更多的小车,这样就可以解释燃油效率最近有大幅的提升了
avgCarSize<-ddply(gasCars,~year,summarise,avgDispl=mean(displ)) ggplot(avgCarSize,aes(year,avgDispl))+geom_point()+geom_smooth()+xlab("Year")+ylab("Average engine displacemment(1)")
6.为了更好地看到这可能会影响到燃油效率地提升,我们逐年绘制出MPG和排量之间地关系。我们使用ddply函数,生成一个新的数据框byYear,包含每年地平均燃油效率和平均引擎排量。
byYear<-ddply(gasCars,~year,summarise,avgMPG=mean(comb08),avgDispl=mean(displ))
head(byYear)
7.head函数展示了生成的新的数据框,这个数据框包含3个列:year、avgMPG以及avgDispl。我们呢将要使用ggplot2包中分面的功能,在同一张图但是不同的面上来逐年显示平均油耗以及平均排量之间的关系。我们必须分解这个数据框,把一个宽的数据框变成一个长的数据框。
byYear2=melt(byYear,id="year") levels(byYear2$variable)<-c("Average MPG","Avg engine displacement")
8.来看看是否自动挡或者手动挡传动比四缸发动的油耗更加高效,以及油耗是如恶化随时变化的
gasCars4<-subset(gasCars,cylinders=="4") ggplot(gasCars4,aes(factor(year),comb08))+geom_boxplot()+facet_wrap(~tranny2,ncol=1)+theme(axis.text.x=element_text(angle = 45))+labs(x="Year",y="MPG")
这次ggplot生成了一个箱线图。这个图帮助展示了每一年值得分布情况(而不只展示像均值这样得单一数值)
研究汽车产量以及车型
1.让我们看看生产商和车型随时间得变化如何燃油得效率。首先,我们看看美国这些年不同的车型和生产商出现的频次,然后将注意力放在四缸发动的车上。
carMake<-ddply(gasCars4,~year,summarise,numberOfMakes=length(unique(make)))
ggplot(carMake,aes(year,numberOfMakes))+geom_point()+labs(x="Year",y="Number of available makes")+ggtitle("Four cylinder cars")
2.我们可以看看每一年的生产商
uniqMakes<-dlply(gasCars4,~year,function(x)unique(x$make)) commonMakes<-Reduce(intersect,uniqMakes) commonMakes
3.这些制造商每年生产出来的汽车的燃油效率如何?我们看到大多数制造商的燃油效率在逐年提升,有一些制造商在最近5年在燃油效率上有一个飞速的提升。
carsCommonMakes4<-subset(gasCars4,make %in% commonMakes) avgMPG_commonMakes<-ddply(carsCommonMakes4,~year+make,summarise,avgMPG=mean(comb08)) ggplot(avgMPG_commonMakes,aes(year,avgMPG))+geom_line()+facet_wrap(~make,nrow=3)
我们使用dlply(注意不是ddply)来操作gasCars4数据框,按照年来分割数据集,然后对每一块的make变量应用一个函数。对每一年,计算出独立的制造商列表,然后dlply返回每一年的列表。dlply输入一个数据框返回一个列表,而ddply输入一个数据框返回一个数据框
使用reduce函数来做更高阶的排序。这个Reduce函数和map reduce编程中的reduce过程的想法是一样的,而map reduce是google提出的基于Hadoop的编程模式。从某种角度来讲,R是一个函数式编程语言,其核心包含一些高阶的函数。所谓高阶函数,是指其输入是其他的函数。在这行代码中,我们将intersect函数作为输入赋值给Reduce函数,这个函数将会对数据集uniqMakes的每一个元素求交集,而这个数据集是我们之前已经生成的每一年不同制造商的列表。最终,结果放在一个新的列表中,这个列表展现了每一年都会出现的制造商。