如何根据矩阵索引值检索矩阵列名和行名?

23

假设我有一个矩阵 mdat,我只知道索引号。如何检索列和行名称?例如:

> mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3, byrow=TRUE, 
    dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3"))) 
> mdat[4] 
[1] 12 
> names(mdat[4]) 
NULL 
> colnames(mdat[4]) 
NULL 
> rownames(mdat[4])
NULL 
> dimnames(mdat[4]) 
NULL 
2个回答

37

首先你需要使用arrayInd获取该索引的行和列。

k <- arrayInd(4, dim(mdat))
你可以通过获取行和列名称的元素来获得正确的名称。
rownames(mdat)[k[,1]]
colnames(mdat)[k[,2]]

或者同时使用 mapply

mapply(`[[`, dimnames(mdat), k)

5
重新阅读此答案,我想知道OP是否只有总索引,因为他们在运行which时没有使用arr.ind=TRUE。以后的读者:如果您从which获得该索引,请使用arr.ind=TRUE获取行和列索引,而不是使用arrayInd - Aaron left Stack Overflow

9

首先对矩阵进行子集操作会得到一个没有名称的单元素向量,正如你在问题中所展示的一样。请记住,子集操作会通过复制创建全新的对象。在子集操作之后无法引用原始的mdat

如果将子集操作的结果赋值给另一个对象,这一点就更加明显了。

> m <- mdat[4]
> m
[1] 12
> names(m)  # no names were printed above... so
NULL

您需要先访问列/行名称,然后对它们进行子集

> colnames(mdat)[3]
[1] "C.3"
> rownames(mdat)[2]
[1] "row2"

您可以类似地重新分配列/行名称。
> colnames(mdat)[3] <- "C3"
> rownames(mdat)[2] <- "row.2"
> mdat
      C.1 C.2 C3
row1    1   2  3
row.2  11  12 13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接