R入门(六)--- 数据对象、习题解答

小心情

emmm,那就是学完这本之后,要看sql,学习一下数据库了。实习要求的东西,也得着手了。内心还是很虚,不想动手,又得硬着头皮前行,晚上学习是不是不大好,大脑总是很兴奋,睡不着。昨晚做了一个很神奇的梦,老爸变得好温柔,简直难以置信,老妈还是个捣蛋鬼,写我的字帖,跟个小孩似的,根本不按字帖来。

###R的对象们

  1. 对象类型有:向量、矩阵、数据框、列表。
  • 向量:由一个或多个同类型变量组成。
  • 矩阵:和向量差不多,由相同类型变量组成,只是维数增加,有行有列。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.读入数据

  1. 将wp.csv读入R中,保存到一个叫wp的对象中,并查看文件内容、总结报告和作图。
  • 查看文件内容,summary(wp)
  • 总结报告、作图plot(wp)、boxplot(phones~contry)、boxplot(phones~year)
  1. 将wp的年份列的列名称改为“year’。
  • names(wp)[1] <- ‘year’
  1. 将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

R入门(六)--- 数据对象、习题解答_第1张图片
R入门(六)--- 数据对象、习题解答_第2张图片R入门(六)--- 数据对象、习题解答_第3张图片
练习8.2.数据类型。

  1. 给wp新增年代列,取值为对应行所属的年代,即“1950s”和“1960s”字符,列名称为"decade。
  2. 查看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.矩阵。

  1. 生成一个5行6列的矩阵,取值为整数数列1:30
  • matrix(data = 1:30,nrow = 5,ncol = 6)

练习8.3参考答案

matrix(data = 1:30,nrow = 5,ncol = 6)

练习8.4.矩阵与数据框。

  1. wp是个对话框对象。请将wp转换成矩阵对象wp_mt,并比较wp与wp_mt的区别。
  • 转为矩阵,矩阵内所有的元素都变成字符形式
  • 而且,数据框允许不同类型的变量存在
  1. 从这两个对象中选取1956年欧洲的电话数量。
  • wp[‘1956’,“Europe”]
  • wp_mt[‘1956’,‘Europe’]
  1. 从这两个对象中选择亚洲和欧洲两列。
  • wp[,c(‘Europe’,‘Asia’)]
  • wp_mt[,c(‘Europe’,‘Asia’)]
  1. 从这两个对象中选择第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.计算。

  1. 计算wp数据中全世界每年的电话总数。
  • annualsum <- rowSums(wp[,2:8])
  1. 计算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年之间:

  1. 电话数量逐年变化的散点图,以及
  2. 电话数量增长率的散点图。电话数量增长率的散点图。

小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()

R入门(六)--- 数据对象、习题解答_第4张图片
练习8.7.循环:

  1. 请以合理的布局。 用循环函数做出所有大洲在各自的电话数量增长曲线。

小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')
}

R入门(六)--- 数据对象、习题解答_第5张图片
练习8.8.拟合

  1. 将各洲电话数量对年份进行线性拟合,并在散点图上添加拟合直线和拟合方程。
  • 添加表达式,可以用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))))
}

R入门(六)--- 数据对象、习题解答_第6张图片

你可能感兴趣的:(R语言)