176 votes

Dans R, sélectionnez les lignes d’une matrice qui satisfont à une condition

Dans l’affaire R avec une matrice :

Je veux extraire la sous-matrice dont les lignes ont la colonne trois = 11. C'est :

Je veux faire cela sans bouclage. Je suis nouveau sur sont donc c’est sans doute très évident, mais la documentation est souvent un peu laconique.

190voto

neilfws Points 3881

C’est plus facile à faire si vous convertissez votre matrice à une trame de données à l’aide de as.data.frame(). Dans ce cas, les réponses précédentes (à l’aide de sous-ensemble ou m$ trois) fonctionnera, sinon ils ne seront pas.

Pour exécuter l’opération sur une matrice, vous pouvez définir une colonne par nom :

Ou par numéro :

Notez que si un seul correspond à une ligne, le résultat est un vecteur entier, pas une matrice.

34voto

John Points 11714
 m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]
 

La commande suivante sélectionnera la première ligne de la matrice ci-dessus.

 subset(m, m[,4] == 16)
 

Et cela sélectionnera les trois derniers.

 subset(m, m[,4] > 17)
 

Le résultat sera une matrice dans les deux cas. Si vous souhaitez utiliser des noms de colonne pour sélectionner des colonnes, vous feriez mieux de le convertir en une image de données avec

 mf <- data.frame(m)
 

Ensuite, vous pouvez sélectionner avec

 mf[ mf$a == 16, ]
 

Ou, avec la commande subset.

12voto

Moe Points 81

Sous-ensemble est une très lente de la fonction , et personnellement, je trouve cela inutile.

Je suppose que vous avez un ensemble de données.cadre, tableau, matrice appelle Mat avec A, B, C que les noms de colonnes; puis tout ce que vous devez faire est de:

  • Dans le cas d'une condition sur une colonne, permet de dire que la colonne A

    Mat[which(Mat[,'A'] == 10), ]
    

Dans le cas de plusieurs conditions sur les différentes colonnes, vous pouvez créer une variable muette. Supposons que les conditions sont A = 10, B = 5, et C > 2, alors nous avons:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

En testant l'avantage de vitesse avec system.time, which méthode est 10x plus rapide que l' subset méthode.

9voto

juba Points 15701

Si votre matrice s'appelle m , utilisez simplement:

 R> m[m$three == 11, ]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X