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

mat*_*fee 5 r vector matrix 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
Run Code Online (Sandbox Code Playgroud)

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

通过矩阵索引获得的向量将是未命名的,除非当行名称(如果有的话)被索引以提供结果的名称时,'x'是一维的.

我的问题是,有没有办法这样做x[, 1],结果 总是未命名,哪里x是矩阵?

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

Ben*_*nes 1

更新为什么下面的代码有效(据我所知)

使用中[R 源文件中包含的函数来处理子集化。当使用矩阵索引来子集矩阵时,将调用该函数。当使用多个索引时(即,行和列各一个,如 中所示),则调用 then 。subset.c~/src/mainVectorSubsetx[,1]MatrixSubset

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


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

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

并使用更宽的 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
Run Code Online (Sandbox Code Playgroud)

对于两个维度都 > 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
Run Code Online (Sandbox Code Playgroud)