5

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

我的问题是以下不一致:

  • 当一个矩阵有不止一行时,我会得到没有名称属性myMatrix[, 1]的第一列。myMatrix这就是我要的。
  • 当一个矩阵正好有一行时,我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

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

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

我的问题是,有没有办法x[, 1]使结果 始终未命名,x矩阵在哪里?

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

4

1 回答 1

1

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

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

该函数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

并使用更宽的 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

对于两个维度 > 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
于 2013-03-05T08:33:19.133 回答