如何通过矩阵索引值检索矩阵列和行名称?

use*_*593 18 indexing r rows matrix

所以,假设我有一个矩阵,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 
Run Code Online (Sandbox Code Playgroud)

Aar*_*ica 27

首先,您需要使用该索引的行和列arrayInd.

k <- arrayInd(4, dim(mdat))
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过获取行名和列名的元素来获取正确的名称

rownames(mdat)[k[,1]]
colnames(mdat)[k[,2]]
Run Code Online (Sandbox Code Playgroud)

或者两者同时使用mapply:

mapply(`[[`, dimnames(mdat), k)
Run Code Online (Sandbox Code Playgroud)

  • 在再次阅读这个答案时,我想知道OP是否只有整体索引,因为他们在没有`arr.ind = TRUE`的情况下运行了`which`.未来的读者:如果您从`which`获取该索引,请使用`arr.ind = TRUE`来获取行和列索引,而不是使用`arrayInd`. (5认同)

Jos*_*ich 7

首先对矩阵进行子集化会产生一个没有名称的单元素向量,如您在问题中所示.请记住,子集通过复制创建一个全新的对象.mdat在子集化之后无法引用原始数据.

如果将子集的结果分配给另一个对象,则更清楚.

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

您真的想首先访问列/行名称并将它们子集化.

> colnames(mdat)[3]
[1] "C.3"
> rownames(mdat)[2]
[1] "row2"
Run Code Online (Sandbox Code Playgroud)

您可以类似地重新分配列/行名称.

> colnames(mdat)[3] <- "C3"
> rownames(mdat)[2] <- "row.2"
> mdat
      C.1 C.2 C3
row1    1   2  3
row.2  11  12 13
Run Code Online (Sandbox Code Playgroud)