seleccionar listas filas especificas datos data crear contar agregar r select matrix submatrix

listas - seleccionar filas en r



Seleccionar filas de una matriz que cumplan una condiciĆ³n (5)

En R con una matriz:

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

Quiero extraer la submatriz cuyas filas tienen la columna tres = 11. Es decir:

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 a menudo es algo escueta.


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

Supongo que tiene un data.frame, array, matrix llamado Mat con A , B , C como nombres de columna; entonces todo lo que necesitas hacer es:

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

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

En el caso de múltiples condiciones en diferentes columnas, puede crear una variable ficticia. Supongamos 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 probar la ventaja de velocidad con system.time , el método es 10 veces más rápido que el método de subset .


Elegiré un enfoque simple usando el paquete dplyr.

Si el marco de datos es información.

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


Esto es más fácil de hacer si convierte su matriz a un marco de datos usando 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 nombre:

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

O por número:

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

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


Si su matriz se llama m , simplemente use:

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


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 últimos tres.

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

El resultado será una matriz en ambos casos. Si desea utilizar nombres de columna para seleccionar columnas, sería mejor que no la convirtiera en un marco de datos con

mf <- data.frame(m)

Entonces puedes seleccionar con

mf[ mf$a == 16, ]

O bien, podría usar el comando de subconjunto.