R语言学习之六

http://blog.163.com/jiangfeng_data/blog/static/20641403820125119121971/


虽然在用R时,为了避免内存消耗过大,常常用向量化来替代循环,但在实践中这种做法并不会时时都起作用,因此熟练运用循环还是很重要的。下面举个例子来说明如何用循环来作图。

1、数据集介绍

鸢尾花(iris)是数据挖掘常用到的一个数据集,包含150种鸢尾花的信息,每50种取自三个鸢尾花种之一(setosa,versicolour和virginica)。每个花的特征用下面的5种属性描述

萼片长度、萼片宽度、花瓣长度、花瓣宽度、类

要求对每个鸢尾花种类的萼片长度和宽度画出散点图,并保存为jpeg格式,由于有3个种类,我们只要绘制3张类似的图,这种情况下,复制3份类似的代码也不是什么难事。但是在显示中有很多数据集并不是这样,例如当要为1000个客户的购买数据各画张图,就要画1000张图,如果一张一张人工的输1000次代码,任务量之大可想而知。此时,用循环的话可以很方便的达到目的。另外说点题外话,用R的lattice包可以在一张图上完成任务(用内置函数即可),这里只考虑用一张张图展示的情况,例子可以类推出去。

2、设计代码的程序

设计代码时应按照一定程序先进行推敲,确定后再写。切不可想都不想就直接就在R写代码。

(1)载入数据熟悉变量名

(2)提取单个类别的数据,对这个子集绘制出萼片长度对宽度的散点图,同时添加图像的标题(鸢尾花的类别)和x,y轴名称。

(3)提取第二个类别数据,确定需要对原始图像做哪些修改,形成通用代码。

(4)确定如何将图像存储为jpeg格式

(5)写一个可以提取第i个类别数据的循环,使用第i个类别数据绘图,并将其存储为一个具有易识别的jpeg格式图片。

3、具体步骤

(1)载入数据

R基础包里就有鸢尾花(iris)数据集,此时我们只需了解下变量名和数据属性即可。

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species"     
> str(iris)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
(2)绘制散点图并添加标签

首先要弄清楚每个种类的名字用unique完成

> unique(iris$Species
+ )
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
这是3个种类的名字,先提取某个种类的数据,画散点图

iris.s<-iris[iris$Species=="setosa",]

plot(iris.s$Sepal.Width,iris.s$Sepal.Length,xlab="the width of sepal",ylab="the length of sepal",main="setosa")

(3)设计通用代码

为了研究代码的通用性,将相同的步骤应用于另外一种类别的数据,针对第一个种类,代码只需做很少的改变。如把setosa改成versicolor即可。当然这里只有3个类别,大可按这个模式再写一次就行,但正如前面所说,如果画1000张图,你就得写1000次了,到这一步,只需把不同的类别用同一种形式表现出来就可以循环了。

iris.i<-iris[iris$Species=="setosa",]

plot(iris.s$Sepal.Width,iris.s$Sepal.Length,xlab="the width of sepal",ylab="the length of sepal",main="setosa")

这里仍出现了2处"setosa",需要替换掉,代码如下

allspecies<-unique(iris$Species)  把种类不重复的表现出来
Species.i<-allspecies[i]

iris.i<-iris[iris$Species==Species.i,]
plot(iris.i$Sepal.Width,iris.i$Sepal.Length,xlab="the width of sepal",ylab="the
length of sepal",main=Species.i)

(4)保存图像

下面要做的就是把图像化为jpeg格式

这里有个问题是如何生成一个文件名随着鸢尾花种类名字(species.i)改变而自动变化的文件,需要选一个包含有一个种类名字扩展为jpg的文件名,可以用paste命令来连接(之间不用空格)

setwd("D:/iris/")   定义路径
filename<-paste(Species.i,".jpg",sep="")
jpeg(filename)
dev.off()

(5)构造循环

最终代码如下

setwd("D:/iris/")
allspecies<-unique(iris$Species)
for(i in 1:3){
Species.i<-allspecies[i]
iris.i<-iris[iris$Species==Species.i,]
filename<-paste(Species.i,".jpg",sep="")
jpeg(filename)
plot(iris.i$Sepal.Width,iris.i$Sepal.Length,xlab="the width of sepal",ylab="the
length of sepal",main=Species.i)
dev.off()}

图形如下

R语言学习之六 - john5feng - wow!数据
R语言学习之六 - john5feng - wow!数据
 
R语言学习之六 - john5feng - wow!数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值