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, por lo que esto probablemente sea muy obvio, pero la documentación a menudo es un tanto breve.
[ ]
las respuestas y verá esto más claramente.Respuestas:
Esto es más fácil de hacer si convierte su matriz en un marco de datos usando as.data.frame (). En ese caso, las respuestas anteriores (usando el subconjunto o m $ tres) funcionarán, de lo contrario no lo harán.
Para realizar la operación en una matriz , puede definir una columna por su nombre:
O por número:
Tenga en cuenta que si solo coincide una fila, el resultado es un vector entero, no una matriz.
fuente
m[m[,3] == 11,,drop=FALSE]
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, aquí Quiero eliminar esas filas de mi df, donde una serie de columnas (arid3a: YY1) contiene el valor T .El siguiente comando seleccionará la primera fila de la matriz anterior.
Y esto seleccionará los últimos tres.
El resultado será una matriz en ambos casos. Si desea utilizar nombres de columna para seleccionar columnas, lo mejor sería convertirlo en un marco de datos con
Entonces puedes seleccionar con
O bien, puede usar el comando de subconjunto.
fuente
Elegiré un enfoque simple usando el paquete dplyr.
Si el marco de datos son datos.
fuente
Subconjunto es una función muy lenta, y personalmente me parece inútil.
Asumo que tiene una hoja.de.datos, matriz, matriz de llamada
Mat
conA
,B
,C
como nombres de columna; entonces todo lo que necesitas hacer es:En el caso de una condición en una columna, digamos la columna A
En el caso de múltiples condiciones en diferentes columnas, puede crear una variable ficticia. Supongamos que las condiciones son
A = 10
,B = 5
yC > 2
, entonces tenemos:Al probar la ventaja de velocidad con
system.time
, elwhich
método es 10 veces más rápido que elsubset
método.fuente
Si se llama a su matriz
m
, simplemente use:fuente
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 valorU
Si el conjunto de datos se denomina datos, todas las filas que cumplan una condición en la que el valor de la columna 'pm2.5'> 300 pueda ser recibido por -
datos [datos ['pm2.5']> 300,]
fuente