3.6 避免意外降维
在统计学领域,“降维”(dimension reduction)是有益的,也存在很多降维的统计学方法。假设我们需要处理10个变量,如果能把变量个数降到3,却还能保留数据的主要信息,何乐而不为呢?
但是在R里,降维指的完全是另外一件事情,而且通常要避免。比如我们有一个4行的矩阵,提取其中的一行:
这个看似没有问题,但是注意看r的显示格式,是向量的格式,而非矩阵的格式。也就是说,r是一个长度为2的向量,而不是一个1乘2的矩阵。我们可以用几种方法来验证它的确已经变成向量了:
可以看到z是有行数与列数的,但是r没有。类似的,str()显示z的行索引区间为1:4,列索引区间为1:2。而r的索引区间是1:2。毫无疑问,r是一个向量而非矩阵。
把r变成向量看似没有问题,但在某些涉及大量矩阵操作的程序中会引起错误。也许程序在大部分情况下都能正常运行,但在少数情况下就是通不过。例如某个程序从一个给定的矩阵里提取一个子矩阵,然后对这个子矩阵进行一些矩阵操作。如果这个子矩阵只有一行,R会把它当作向量处理,后面的矩阵操作无法运行在这个向量上,程序会出错。
幸好R里有办法禁止矩阵自动减少维度:使用drop参数。仍以上述矩阵z为例:
现在r是一个1乘以2的矩阵而非由两元素组成的向量。
因此,需要经常性地在矩阵操作代码里使用参数drop=FALSE。
为什么说drop是一个参数呢?因为 [ 事实上也是一个函数,跟+等操作符一样。请看以下代码: