利用向量,我们可以计算某个班级同学某一门课的平均分数,例如英语成绩:张三(95),李四(88),王二(79),这五(59),那六(92),这时候先建立向量并赋值给一个变量:
English <- c(95,88,79,59,92)
然后可以进行各种运算,比如求和,取均值,计算方差、标准差等。
但是,我们的成绩并非只有英语一门,而是有很多门。在计算多门课程的分数时,可以用到R语言中的矩阵。矩阵 是一种“矩形”的表格数据,有行有列,行通常情况表示“记录”,列表示“变量”或“字段”,虽然两者“颠倒”后仍然可以进行计算,但是依照国际惯例,最好遵从行为“记录”列为“变量”。每一条“记录”实际上就是你测试的对象及其在所有变量上的测定值或调查值。比如本例中,每个同学都有一个英语成绩,如表3-1,每一行为一条记录,英语成绩叫做“变量”或者“字段”。在矩阵中,全部值只能是一种类型,因此,作为字符型的姓名列不能在矩阵中,只能作为矩阵的行名。后文会继续介绍。
姓名row.names 英语成绩 张三 95 李四 88 王二 79 这五 59 那六 92
表3-1 英语成绩的矩阵 矩阵还有一个特别需要了解的概念是维度。每个变量表示1个维度,简单来说,有几列就是几维,例如有10个变量的矩阵即为10维矩阵。表3-1是有一个维度的矩阵。要查看一个对象的维度,可以使用dim()函数。注意在R语言中,向量是不能查询维度的,因为向量的维度固定为1。
dim(English)
NULL
接下来是有趣的事情了,假如说,我们班级有5位同学,即张三,李四,王二,这五,那六。他们的英语成绩为:95、88、79、59、92;数学成绩为:98、60、58、82、71;体育成绩为:100、95、98、100、100。那么我们可以用向量的形式将成绩录入到R中。
scores <- c(95, 88, 79, 59, 92, 98, 60, 58, 82, 71, 100, 95, 98, 100, 100)
接下来,我们需要将这个向量转换成矩阵。用到上面的dim()函数。
dim(scores) <- c(5,3) # 为向量增加维度属性,5条记录,3个变量
scores # 查看结果
class(scores) # 查看对象类型
从上面结果可以看到,向量已经转换成我们期望的矩阵了。查看对象类型,也出现的矩阵字样。
同样的,使用R内置的matrix()函数,也可以这样建立矩阵:
scores <- c(95, 88, 79, 59, 92, 98, 60, 58, 82, 71, 100, 95, 98, 100, 100) matrix(scores, nrow=5)
这个矩阵看起来略微别扭,没有显示人名和科目,我们现在将这个信息添加到矩阵中。用到rownames()和colnames()函数。
rownames(scores) <- c(“张三”,”李四”,”王二”,”这五”,”那六”) colnames(scores) <- c(“英语”,”数学”,”体育”) scores
从向量转变成矩阵还有另一种方法:1. 将每门功课的分数分别输入到向量;2. 利用cbind()函数将这些向量按照列组合起来。
English <- c(95, 88, 79, 59, 92) mathematics <- c(98, 60, 58, 82, 71) P.E. <- c(100, 95, 98, 100, 100) scores2 <- cbind(English,mathematics,P.E.) socres2
前面我们说了,矩阵内只能存储一种数据类型。那么,我们把多个数据类型放入矩阵中,看看会出现什么结果,比如:我们同学的姓名整合进矩阵中。
cnames <- c(“张三”,”李四”,”王二”,”这五”,”那六”) scores3 <- cbind(cnames,English,mathematics,P.E.) scores3
从结果中不难发现,所有的数据都加了双引号,即被识别为字符串。此时,程序发生了隐式强制(implicit coercion),我们没有要求它这么做,但它就这样发生了。字符串的结果是不能直接进行加减乘除等数学运算的,所以建立矩阵的时候一定要注意保持数据格式的统一。为什么强制转换成字符串而不是数值型呢?同学们可以考虑一下这个问题。
思考题:
某一个给定的矩阵中的值有几种类型? 有三位同学,英语、数学、体育的分数分别为A:86、69、98;B:71、55、100;C:60、62、90。如果建立该矩阵?