2011-03-22 44 views
99

en R con una matriz:En R, seleccione filas de una matriz que cumplen una condición

 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 

I desea extraer la submatriz cuyas filas tienen la columna tres = 11. Esto es:

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

Quiero hacer esto sin bucles. Soy nuevo en R, así que esto es probablemente muy obvio, pero la documentación de suele ser algo escueta.

+3

La idea básica en cada respuesta es que si usted tiene un vector/matriz lógica (Trues y Falsas) de la misma longitud que algún índice, tendrá que elegir sólo los casos que son verdaderas. Ejecute los códigos entre '[]' en las respuestas y verá esto más claramente. –

+2

+1 a "la documentación es concisa". – appleLover

Respuesta

114

Esto es fácil de hacer si usted convierte su matriz a una trama de datos utilizando as.data.frame(). En ese caso, las respuestas anteriores (con subconjunto o m $ 3) funcionarán, de lo contrario no lo harán.

para realizar la operación en una matriz, puede definir una columna por su nombre:

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

O por número:

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

Tenga en cuenta que si sólo una fila coincide, el resultado es un vector entero, no una matriz.

+11

si necesita mantener la matriz, luego haga' m [m [, 3] == 11,, drop = FALSE] ' –

+0

Muchas gracias a todos los que respondieron: disculpe el retraso en el acuse de recibo, la notificación de stackoverflow la dirección de correo electrónico fue incorrecta – peter2108

+0

@neilfws ¿Cuál será la solución si quiero definir algunos valores para un rango de columnas? por ejemplo 'df <- df [! which (df $ ARID3A: df $ YY1 ==" U "),]', aquí quiero eliminar esas filas de mi df donde un rango de columnas (ARID3A: YY1) contiene el valor * U *. – Newbie

4

Si su matriz se llama m, sólo tiene que utilizar:

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

Eso funcionará para marcos de datos, pero no para matrices. – neilfws

+0

@juba ¿Cuál será la solución si quiero definir algunos valores para un rango de columnas? por ejemplo 'df <- df [! which (df $ ARID3A: df $ YY1 ==" U "),]', aquí quiero eliminar esas filas de mi df donde un rango de columnas (ARID3A: YY1) contiene el valor 'U' – Newbie

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

El siguiente comando seleccionará la primera fila de la matriz de arriba.

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

Y esto seleccionará los tres últimos.

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

El resultado será una matriz en ambos casos. Si desea utilizar nombres de columna para seleccionar columnas, entonces sería mejor fuera de su conversión en una trama de datos con

mf <- data.frame(m) 

continuación, puede seleccionar con

mf[ mf$a == 16, ] 

O bien, puede utilizar el comando subconjunto .

4

El subconjunto es una función muy lenta, y personalmente me parece inútil.

que suponga que tiene un hoja.de.datos, matriz, matriz de llamada Mat con A, B, C como nombres de columna; entonces todo lo que necesita hacer es:

  • En el caso de una condición en una columna, digamos que la columna A

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

En el caso de múltiples condiciones en diferentes columna, puede crear una variable ficticiaSupongamos que las condiciones son A = 10, B = 5 y C > 2, entonces tenemos:

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

Al poner a prueba la ventaja de la velocidad con system.time, el método which es 10 veces más rápido que el método subset.

10

Elegiré un enfoque simple usando el paquete dplyr.

Si el marco de datos son datos.

library(dplyr) 
result <- filter(data,data$three == 11) 
Cuestiones relacionadas