小心情
emmm,那就是学完这本之后,要看sql,学习一下数据库了。实习要求的东西,也得着手了。内心还是很虚,不想动手,又得硬着头皮前行,晚上学习是不是不大好,大脑总是很兴奋,睡不着。昨晚做了一个很神奇的梦,老爸变得好温柔,简直难以置信,老妈还是个捣蛋鬼,写我的字帖,跟个小孩似的,根本不按字帖来。
###R的对象们
- 对象类型有:向量、矩阵、数据框、列表。
- 向量:由一个或多个同类型变量组成。
- 矩阵:和向量差不多,由相同类型变量组成,只是维数增加,有行有列。image()函数专门针对矩阵作图的
- 数据框:不同列可以是不同类型。数据框的列,仍是向量;但数据框的行,是数据框。(用str()查看数据框结构)
- 列表:跟数据框差不多,但是列表中的不同项目的长度可以不一。
> a <- matrix(c('a',1,2,3),nrow = 2)
> a
[,1] [,2]
[1,] "a" "2"
[2,] "1" "3"
> is.matrix(a)
[1] TRUE
> is.character(a)
[1] TRUE
> is.numeric(a[2,2])
[1] FALSE
- 请先运行下面的代码,生成个示例数据 文件:
write.csv(WorldPhones,file = ‘E:/R/R lab/学R/r4r/wp.csv’) - 打开这个文件浏览一下。这是20世纪五六十年代世界各大洲的电话数量。下面的练习,均以此文件为出发点。
练习8.1.读入数据
- 将wp.csv读入R中,保存到一个叫wp的对象中,并查看文件内容、总结报告和作图。
- 查看文件内容,summary(wp)
- 总结报告、作图plot(wp)、boxplot(phones~contry)、boxplot(phones~year)
- 将wp的年份列的列名称改为“year’。
- names(wp)[1] <- ‘year’
- 将wp的行名称改为对应年份。
- rownames(wp) <- wp$year
练习8.1参考答案
write.csv(WorldPhones,file = 'E:/R/R lab/学R/r4r/wp.csv')
#读入文件
myfile <- file.choose()
wp <- read.csv(file = myfile,header = T)
summary(wp)
plot(wp)
#对数据进行作图
phones <- unlist(wp[,2:8])
contry <- rep(names(wp)[2:8], each = length(wp$X))
year <- rep(wp$X,7)
boxplot(phones~contry)
boxplot(phones~year)
#将年份列的列名称改为‘year’
names(wp)[1] <- 'year'
#将行名改为对应年份
rownames(wp) <- wp$year
练习8.2.数据类型。
- 给wp新增年代列,取值为对应行所属的年代,即“1950s”和“1960s”字符,列名称为"decade。
- 查看wp各列的数据类型。
- str(wp)
练习8.2参考答案
##数据类型
str(wp)
wp$year <- as.numeric(wp$year)
decade <- ifelse(wp$year >= 1950 & wp$year <= 1959,'1950s' , '1960s')
wp$decade <- decade
str(wp)
练习8.3.矩阵。
- 生成一个5行6列的矩阵,取值为整数数列1:30
- matrix(data = 1:30,nrow = 5,ncol = 6)
练习8.3参考答案
matrix(data = 1:30,nrow = 5,ncol = 6)
练习8.4.矩阵与数据框。
- wp是个对话框对象。请将wp转换成矩阵对象wp_mt,并比较wp与wp_mt的区别。
- 转为矩阵,矩阵内所有的元素都变成字符形式
- 而且,数据框允许不同类型的变量存在
- 从这两个对象中选取1956年欧洲的电话数量。
- wp[‘1956’,“Europe”]
- wp_mt[‘1956’,‘Europe’]
- 从这两个对象中选择亚洲和欧洲两列。
- wp[,c(‘Europe’,‘Asia’)]
- wp_mt[,c(‘Europe’,‘Asia’)]
- 从这两个对象中选择第2,4,5行,选择除2,4,5行之外的其他行。
-
#选择2,4,5行
wp[c(2,4,5),]
wp_mt[c(2,4,5),] -
反选2,4,5行
wp[-c(2,4,5),]
wp_mt[-c(2,4,5),]
练习8.4参考答案
wp_mt <- as.matrix(wp)
#转为矩阵,矩阵内所有的元素都变成字符形式,而数据框允许不同类型的变量存在
str(wp_mt)
str(wp)
#选择1956年欧洲电话数量
wp['1956',"Europe"]
wp_mt['1956','Europe']
#选择欧洲和亚洲两列
wp[,c('Europe','Asia')]
wp_mt[,c('Europe','Asia')]
#选择2,4,5行
wp[c(2,4,5),]
wp_mt[c(2,4,5),]
#反选2,4,5行
wp[-c(2,4,5),]
wp_mt[-c(2,4,5),]
练习8.5.计算。
- 计算wp数据中全世界每年的电话总数。
- annualsum <- rowSums(wp[,2:8])
- 计算wp数据中任意相邻年份,全世界以及各洲的电话增长数量以及增长百
分比。
- 全世界逐年增长annualdiff <- diff(annualsum)
- 各洲逐年增长annualdiffeach <- apply(wp[,2:8], MARGIN = 2, diff)
- 全世界逐年增长率annualrate <- annualdiff/annualsum[1:6]
- 各洲逐年增长率annualrateeach <- annualdiffeach/(wp[c(1:6),2:8])
练习8.5参考答案
annualsum <- rowSums(wp[,2:8])
annualdiff <- diff(annualsum)
annualdiffeach <- apply(wp[,2:8], MARGIN = 2, diff)
annualrate <- annualdiff/annualsum[1:6]
annualrateeach <- annualdiffeach/(wp[c(1:6),2:8])
#等同于
annualrateeach <- apply(wp[,2:8],MARGIN = 2,
function(x) diff(x)/x[1:6])
练习8.6.作图。
请在同-张图上以合理的布局、颜色和线型,做出亚洲1951到1961年之间:
- 电话数量逐年变化的散点图,以及
- 电话数量增长率的散点图。电话数量增长率的散点图。
小tips:如何将两个变量(不同数量级量纲)作到同一个图中
- 首先,仍是设置上下两个图纸不变mfrow=c(2,1);
- 但是,要注意,上图距离下方距离设为0,下图距离上方距离设为0,同左,同右方的距离相同;
- 上图和下图的横坐标要共轴,并且上图的坐标轴要设置为axes = FALSE;
- 再给上图单独添加y轴axis(2),以及边框box(),下图横轴标签。
练习8.6参考答案
par(mfrow=c(2,1),mar=c(0,4,3,1))
plot(wp$year,wp$Asia,type = 'l',xlim = c(1951,1961),
axes = FALSE,xlab = '',ylab = 'Phone Asia')
axis(2)
box()
par(mar=c(4,4,0,1))
plot(wp$year[1:6],annualrateeach[,'Asia'],
type = 'l',xlim = c(1951,1961),
xlab = 'year',ylab = 'Increase rate')
dev.off()
练习8.7.循环:
- 请以合理的布局。 用循环函数做出所有大洲在各自的电话数量增长曲线。
小tips:
- 由于各个洲的电话数量范围不一,所以要得到全部数据的范围,才能方便确定y轴,将不同洲安置在同一张图中;
- 在循环中,plot函数无法在已有的图中继续添加直线,只有lines()或者points()可以继续添加直线;
- 因此,需要先用plot函数确定好幕布,再用lines函数在循环里面起作用;
练习8.7参考答案
par(mfrow=c(1,1))
mylim <- range(wp[,2:8])
mycol <- rainbow(7)
plot(wp$year,wp[,2],col=mycol[1],type = 'l',
xlab = 'year',ylab = 'Phone number',ylim = mylim)
for (i in 3:8) {
lines(wp$year, wp[,i], col=mycol[i-1])
legend('topleft',legend = names(wp)[2:8],lty = 1,
col = mycol,bty = 'n')
}
练习8.8.拟合
- 将各洲电话数量对年份进行线性拟合,并在散点图上添加拟合直线和拟合方程。
- 添加表达式,可以用as.expression(),并且将参数以列表的形式存储
练习8.8参考答案
par(mfrow=c(3,3),mar=c(4,4,0.1,0.1))
for (i in 2:8) {
plot(wp$year,wp[,i],col=mycol[i-1],
xlab = 'year',ylab = names(wp)[i])
m <- lm(wp[,i]~wp$year)
a1 <- m$coefficients[1]
a2 <- m$coefficients[2]
abline(m)
legend('topleft',bty = 'n',
as.expression(substitute(y==a+b*x,
list(a=a1,b=a2))))
}