web-dev-qa-db-fra.com

Comment supprimer des lignes d'une matrice par nom de ligne, plutôt que par index numérique?

J'ai une matrice g:

> g[1:5,1:5]
        rs7510853 rs10154488 rs12159982 rs2844887 rs2844888
NA06985 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06991 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06993 "CC"      "CC"       "CC"       "CC"      "CC"     
NA06994 "CC"      "CC"       "CC"       "CC"      "CC"     
NA07000 "CC"      "CC"       "CC"       "CC"      "CC"     
> rownames(g)[1:2]->remove
> remove
[1] "NA06985" "NA06991"
> g[-remove,]

Erreur dans -remove: argument non valide à l'opérateur unaire

Existe-t-il un moyen simple de faire ce que je veux faire ici (supprimer les identifiants référencés dans le vecteur "supprimer" de la matrice g?

Note: ceci est juste un modèle pour ce que je veux réellement faire, s'il vous plaît ne dites pas simplement faire g[-(1:2), ], je dois être capable de supprimer tout un tas de lignes qui J'ai ID-d.

33
JoshDG

Lorsque vous travaillez avec l'indexation, vous ne pouvez pas utiliser de vecteurs de caractères "négatifs". Vous pouvez convertir en logique avec% en%

g[!rownames(g) %in% remove, ]

Si vous vouliez vraiment utiliser une indexation négative, cela pourrait être fait:

g[-which(rownames(g) %in% remove), ]

... cependant, il a un résultat erroné potentiellement désagréable qui se produit lorsqu'il n'y a pas de noms de domaine dans le vecteur cible. Le résultat peut être aucune valeur retournée.

60
42-

Vous ne pouvez pas indexer négativement un vecteur de caractères lors de l'indexation. Transformez votre vecteur remove en booléen. J'ai défini une fonction

`%notin%` <- function(x,y) !(x %in% y) 

qui peut ensuite être utilisé comme tel: g[rownames(g) %notin% remove ,]

7
Chase

J'utilise "setdiff" comme suit:

g[setdiff(rownames(g),remove),]
4
Ofri Mann