一致地将子集矩阵转换为向量并避免使用colnames?

时间:2013-03-05 03:34:15

标签: r matrix vector subset

我想知道是否有R语法从矩阵中提取列,而总是在返回的向量上没有name属性(我希望依赖于此行为)。

我的问题是以下不一致:

  • 当矩阵有多行并且我myMatrix[, 1]时,我会得到myMatrix的第一列,没有name属性。这就是我想要的。
  • 当矩阵恰好一行而我myMatrix[, 1]时,我会得到myMatrix 的第一列,但它有第一个colname作为其名称即可。

我希望能够myMatrix[, 1]始终获得无名称的内容。

举例说明:

# make a matrix with more than one row,
x <- matrix(1:2, nrow=2)
colnames(x) <- 'foo'
#      foo
# [1,]   1
# [2,]   2

# extract first column. Note no 'foo' name is attached.
x[, 1]
# [1] 1 2

# now suppose x has just one row (and is a matrix)
x <- x[1, , drop=F]
# extract first column
x[, 1]
# foo    # <-- we keep the name!!
#   1

现在,[?'[')的文档提到了这种行为,所以它不是一个bug或任何东西(虽然,为什么?!为什么会出现这种不一致?!):

  

通过矩阵索引获得的向量将是未命名的除非'x'是一维的,否则将对行名称(如果有)进行索引以提供结果的名称。

我的问题是,有没有办法x[, 1],结果总是未命名,其中x是一个矩阵?

我唯一的希望unname(x[, 1])还是有类似于[ drop论点的东西?或者有一个选项,我可以设置说“永远不知名”?我可以使用的一些技巧(当提取的结果是向量时,以某种方式覆盖[的行为?)

1 个答案:

答案 0 :(得分:1)

更新以下代码的工作原理(据我所知)

使用[中的R源文件subset.c中包含的函数处理~/src/main的子集。当使用矩阵索引来对矩阵进行子集时,调用函数VectorSubset。如果使用了多个索引(即x[,1]中的行和列各一个),则调用MatrixSubset

函数VectorSubset仅将名称分配给被子集化的一维数组。由于矩阵是二维数组,因此在使用矩阵索引时,不会为结果分配任何名称。但是,函数MatrixSubset在某些情况下会尝试传递dimnames。


因此,您在帮助页面引用中引用的矩阵索引似乎是关键:

x <- matrix(1)
colnames(x) <- "foo"
x[, 1]  ## 'Normal' indexing
# foo 
#   1 
x[matrix(c(1, 1), ncol = 2)]  ## Matrix indexing
# [1] 1

使用更宽的1行矩阵:

xx <- matrix(1:10, nrow = 1)
colnames(xx) <- sprintf('foo%i', seq_len(ncol(xx)))
xx[, 6]  ## 'Normal' indexing
# foo6 
#    6 
xx[matrix(c(1, 6), ncol = 2)]  ## Matrix indexing
# [1] 6

使用两个维度&gt;的矩阵1:

yy <- matrix(1:10, nrow = 2, dimnames = list(NULL,
  sprintf('foo%i', 1:5)))

yy[cbind(seq_len(nrow(yy)), 3)]  ## Matrix indexing
# [1] 5 6