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)
首先对矩阵进行子集化会产生一个没有名称的单元素向量,如您在问题中所示.请记住,子集通过复制创建一个全新的对象.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)