我想知道是否有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
论点的东西?或者有一个选项,我可以设置说“永远不知名”?我可以使用的一些技巧(当提取的结果是向量时,以某种方式覆盖[
的行为?)
答案 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