R语言矩阵维度“消失”的问题

wbingyang 2020-02-12

矩阵(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语言能够正确返回矩阵的维度了。

相关推荐