web-dev-qa-db-fra.com

Sélectionner les lignes d'une matrice qui remplissent une condition

En R avec une matrice:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

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

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

Je veux faire cela sans faire de boucle. Je suis nouveau sur R, donc c’est probablement très évident, mais la documentation est souvent un peu laconique.

123
peter2108

C'est plus facile si vous convertissez votre matrice en un cadre de données en utilisant as.data.frame (). Dans ce cas, les réponses précédentes (avec sous-ensemble ou m $ 3) fonctionneront, sinon elles ne fonctionneront pas.

Pour effectuer l'opération sur une matrice, vous pouvez définir une colonne par son nom:

m[m[, "three"] == 11,]

Ou par numéro:

m[m[,3] == 11,]

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

140
neilfws
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, il serait préférable 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, vous pouvez utiliser la commande subset.

26
John

Je choisirai une approche simple en utilisant le package dplyr.

Si le dataframe est data.

library(dplyr)
result <- filter(data, three == 11)
18
mavez DABAS

Subset est une fonction très lente et personnellement, je la trouve inutile.

Je suppose que vous avez un data.frame, un tableau, une matrice appelée Mat avec A, B, C comme noms de colonnes; alors tout ce que vous devez faire est:

  • Dans le cas d'une condition sur une colonne, disons la colonne A

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

Dans le cas de plusieurs conditions sur une colonne différente, vous pouvez créer une variable factice. 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 la vitesse avec system.time, la méthode which est 10 fois plus rapide que la méthode subset.

11
Mohamad Elmasri

Si votre matrice s'appelle m, utilisez simplement:

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

Si l'ensemble de données s'appelle data, toutes les lignes répondant à une condition dans laquelle la valeur de la colonne 'pm2.5'> 300 peut être reçue par -

data [data ['pm2.5']> 300,]

0
Anvita Shukla