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.