2010-11-18 15 views
24

me gustaría elegir filas en función de los subconjuntos de sus nombres, por ejemplo¿cómo grep en R?

Si he los siguientes datos:

data <- structure(c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
.Names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
"fum-", "fum-", "fum-")) 

¿cómo seleccionar las filas que contengan 'foo'?

usando grep() no funciona:

grep('foo', data) 

devuelve:

integer(0) 

¿qué estoy haciendo mal? ¿O hay un mejor camino?

Gracias!

Respuesta

27

Debe grep la propiedad de los nombres de los datos, no la propiedad values.

Para su ejemplo, el uso

> grep("foo",names(data)) 
[1] 5 6 7 
> data[grep("foo",names(data))] 
    foo- foo1234- 123foo- 
    87  91  91 

Otra forma limpia de hacer esto es utilizando tramas de datos.

> data <- data.frame(values=c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
        names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
        "fum-", "fum-", "fum-")) 

> data$values[grep("foo",data$names)] 
[1] 87 91 91 
6

Uso subconjunto en combinación con las expresiones regulares:

subset(your_data, regexpr("foo", your_data$your_column_to_match) > 0)) 

Si sólo se preocupa por un conjunto de datos con una columna que supongo que no es necesario especificar un nombre de columna ...

Philip

+6

Por lo general, me parece que 'grepl' es más útil aquí; puede omitir la comparación vs 0 cosa, lo que hace que el código se vea un poco más limpio. – Harlan

2
> grep("foo",names(data), value=T) 
[1] "foo-"  "foo1234-" "123foo-" 

Si el valor es verdadero, devuelve el contenido en lugar del índice