web-dev-qa-db-fra.com

Comment récupérer une colonne de matrice et un nom de ligne par une valeur d'index de matrice?

Alors disons que j'ai une matrice, mdat et je ne connais que le numéro d'index. Comment récupérer les noms de colonne et de ligne? Par exemple:

> 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 
19
user1301593

Vous devez d'abord obtenir la ligne et la colonne de cet index à l'aide de arrayInd.

k <- arrayInd(4, dim(mdat))

Vous pouvez ensuite obtenir le bon nom en obtenant cet élément des noms de ligne et de colonne

rownames(mdat)[k[,1]]
colnames(mdat)[k[,2]]

Ou les deux à la fois en utilisant mapply:

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

Le sous-ensemble de la matrice résulte d'abord en un vecteur à un élément qui n'a pas de nom, comme vous le montrez dans votre question. N'oubliez pas que le sous-ensemble crée un objet complètement nouveau via la copie. Il n'y a aucun moyen de référencer le mdat d'origine après le sous-ensemble.

Ceci est plus clair si vous affectez le résultat du sous-ensemble à un autre objet.

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

Vous voulez vraiment accéder d'abord aux noms de colonne/ligne et au sous-ensemble eux.

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

Vous pouvez réaffecter des noms de colonne/ligne de la même manière.

> colnames(mdat)[3] <- "C3"
> rownames(mdat)[2] <- "row.2"
> mdat
      C.1 C.2 C3
row1    1   2  3
row.2  11  12 13
7
Joshua Ulrich