2011-09-23 42 views
10

He leído en un archivo csv en forma de matriz (tiene m filas yn columnas). Quiero filtrar la matriz mediante la realización de un filtro en forma verbal:Filtrar un marco de datos

Seleccione todos los valores de la columna x donde los valores de otra columna en esta fila sean iguales a "blabla".

Es como una declaración select en la base de datos donde digo que estoy interesado en un subconjunto de la matriz donde estas restricciones deben ser satisfechas.

¿Cómo puedo hacerlo en r? Tengo los datos como marco de datos y puedo acceder a ellos por los encabezados. data["column_values" = "15"] no me devuelve las filas donde la columna nombrada valores_columna tiene solo valores 15.

Gracias

Respuesta

15

Dijiste que solo querías los valores de la columna x donde column_values ​​era 15, ¿verdad?

subset(dat, column_values==15, select=x) 

Creo que esto puede ser una trama de datos por lo que es possble puede que tenga que no listados() y tal vez incluso "unfactor" la misma.

> dat 
    Subject Product 
1  1 ProdA 
2  1 ProdB 
3  1 ProdC 
4  2 ProdB 
5  2 ProdC 
6  2 ProdD 
7  3 ProdA 
8  3 ProdB 
> subset(dat, Subject==2, Product) 
    Product 
4 ProdB 
5 ProdC 
6 ProdD 
> unlist(subset(dat, Subject==2, Product)) 
Product1 Product2 Product3 
    ProdB ProdC ProdD 
Levels: ProdA ProdB ProdC ProdD 
> as.character(unlist(subset(dat, Subject==2, Product))) 
[1] "ProdB" "ProdC" "ProdD" 

Si desea que todas las columnas que puede caer el tercer argumento (el selecto = argumento):

subset(dat, Subject==2) 

    Subject Product 
4  2 ProdB 
5  2 ProdC 
6  2 ProdD 
+0

gracias por la respuesta. En realidad, quiero recuperar todo el subconjunto, me refiero también a otras columnas. puede por favor mostrarme cómo puedo obtener el resultado 2 Prod B; 2 ProdC; 2 ProdC de nuevo? En mi caso, quiero filtrar en más de una columna como Jack mostró. Pero todavía no está funcionando. ¿Puedes ver el error? ¡Gracias! – Bob

+0

Publicado una edición. Puede especificar cualquier combinación de factores en un vector de nombres de columnas entre comillas o sin comillas. 'subset' también va a omitir todas las molestas coincidencias de NA que odio y que otras personas aprecian. –

+0

Intenté subconjunto (datos, V1 == "estocástico", V6 == "independiente"). Pero no está funcionando. V1 y V6 son dos encabezados de columna. El resultado es> subconjunto (datos, V1 == "estocástico", V6 == "independiente") marco de datos con 0 columnas y 196 filas ¿Por qué no obtengo todos los datos en su forma inicial pero solo las filas? donde v1 y v6 están satisfechos? – Bob

8

Suponiendo que dat es la trama de datos en cuestión, col es el nombre de la columna y "value" es el valor que se desea, se puede hacer

dat[dat$col=="value",]

que recupera todos de las filas de dat para las cuales dat$col=="value", y todas las columnas.

+0

¿cómo puedo seleccionar más de dos columnas? Una columna funciona bien. Por ejemplo, probé estos datos [datos $ V1 == "estocásticos", datos $ V6 == "independientes",] ¿cómo puedo realizar y operar mientras selecciono más de dos columnas? – Bob

+0

'data [data $ V1 ==" estocástico "&& data $ V6 ==" independent ",]' –

+0

data [data $ V1 == "estocástico" && data $ V6 == "estocástico",] [1] V1 V2 V3 V4 V5 V6 V7 V8 V9 V11 V12 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 <0 rows> (o nombres de filas 0-longitud) no muestra el resultado. Estoy seguro de que el resultado no está vacío. ¿Alguna idea? – Bob

4

En primer lugar, cabe destacar que un matrix y una data.frame son cosas diferentes en R. imagina que tienes un data.frame (ya que es lo que devuelve read.csv()). data.frame tienen columnas con nombre (si no las das, las genéricas se crean para ti).

Puede subconjuntar un data.frame indicando qué filas desea y/o qué columnas desea. La forma más fácil de especificar qué filas es con un vector lógico, a menudo creado a partir de comparaciones usando columnas específicas del data.frame. Por ejemplo data[["column values"]] == "15" haría un vector lógico que es TRUE si la entrada correspondiente en la columna column values es la cadena "15" (ya que está entre comillas, es una cadena, no un número). Puede hacer los criterios de selección más complicados que desee (combinando vectores lógicos con & y |) para especificar las filas que desea. Este vector se convierte en el primer argumento en la indexación.

Una lista de nombres o números de columna puede ser el segundo argumento. Si falta alguno de los argumentos, se suponen todas las filas (o columnas).

Poniendo todo esto junto, se obtiene ejemplos como

data[data[["column values"]] == "15", ] 

o el uso de un conjunto de datos reales (mtcars)

mtcars[mtcars$am == 1, ] 
mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg"] 
mtcars[mtcars$am == 1 & mtcars$hp > 100, "mpg", drop=FALSE] 
mtcars[mtcars$hp > 100, c("mpg", "carb")] 

Tome un vistazo a lo que cada uno de los condicionales (primeros argumentos, por ejemplo, mtcars$am == 1 & mtcars$hp > 100) return para tener una mejor idea de cómo funciona la indexación.

Cuestiones relacionadas