矩阵(matrix)是R语言中很基础的一种数据结构,也是R语言使用者经常使用的一种数据结构。矩阵的维度一般为二维(m*n)。
R语言中矩阵的操作是非常简单易懂的,但是在对R语言做矩阵操作时,有个地方需要特别注意。下面我们通过一个例子说明。
首先,我们创建一个用于测试的矩阵。
test1 <- matrix(data = c(1:6), nrow = 3, ncol = 2, dimnames = list(c("row1", "row2", "row3"), c("col1", "col2")))
然后我们查看下这个矩阵,矩阵是一个三行两列的矩阵。
> test1 col1 col2 row1 1 4 row2 2 5 row3 3 6
然后,我们任意取出它们的子矩阵并使用dim()函数查看子矩阵的维度。
> dim(test1[1:2, ]); test1[1:2, ] [1] 2 2 col1 col2 row1 1 4 row2 2 5 > dim(test1[2, ]); test1[2, ] NULL col1 col2 2 5
我们发现第一次取出某个维度为2*2的子矩阵时,系统正确返回了子矩阵的维度,而当我们第二次取出一个维度为1*2的子矩阵时,系统却未能正确返回子矩阵的维度且维度为NULL。很显然,R语言将这个子矩阵当成向量处理了,因此维度也“消失”了。这个是非常需要注意的,笔者日常使用R语言分析数据的时候,也不经意间落入过这个“圈套”,有时候感觉代码逻辑上没有任何的错误,但当运行程序的时候,就会出现这个某个令人不解的error,然后需要花上一点时间慢慢debug,然后恍然大悟,原来是这个原因。
解决或者说避免出现这个问题也是非常简单的,我们可以直接使用drop参数。
> # using the drop parameter > dim(test1[2, , drop = FALSE]) [1] 1 2
我们可以看到,将drop参数设为FALSE之后,R语言能够正确返回矩阵的维度了。