2012-07-18 60 views
9

Tengo una trama de datos como este:El uso de grep en I para eliminar filas de una hoja.de.datos

d <- data.frame(cbind(x=1, y=1:10, z=c("apple","pear","banana","A","B","C","D","E","F","G")), stringsAsFactors = FALSE) 

me gustaría eliminar algunas filas de esta trama de datos, dependiendo del contenido de la columna z :

new_d <- d[-grep("D",d$z),] 

Esto funciona bien; fila 7 se ha borrado:

new_d 
    x y  z 
    1 1 1 apple 
    2 1 2 pear 
    3 1 3 banana 
    4 1 4  A 
    5 1 5  B 
    6 1 6  C 
    8 1 8  E 
    9 1 9  F 
    10 1 10  G 

Sin embargo, cuando se utiliza grep para buscar contenido que no está presente en la columna z, parece eliminar todo el contenido de la trama de datos:

new_d <- d[-grep("K",d$z),] 
    new_d 
    [1] x y z 
    <0 rows> (or 0-length row.names) 

lo haría me gusta buscar y eliminar filas de esta o de otra manera, incluso si la cadena de caracteres que estoy buscando no está presente. ¿Como va esto?

Respuesta

18

Puede usar el subconjunto TRUE/FALSE en lugar de numérico.

grepl es como grep, pero devuelve un vector logical. La negación funciona con eso.

d[!grepl("K",d$z),] 
    x y  z 
1 1 1 apple 
2 1 2 pear 
3 1 3 banana 
4 1 4  A 
5 1 5  B 
6 1 6  C 
7 1 7  D 
8 1 8  E 
9 1 9  F 
10 1 10  G 
1

Quiere usar grepl en este caso, por ejemplo, new_d <- d[! grepl("K",d$z),].

7

Aquí es su problema:

> grep("K",c("apple","pear","banana","A","B","C","D","E","F","G")) 
integer(0) 

Grepl Try() en su lugar:

d[!grepl("K",d$z),] 

Esto funciona porque el vector lógica negada tiene una entrada para cada fila:

> grepl("K",d$z) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
> !grepl("K",d$z) 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
0

Para completar, ya que R 3.3.0, grep y amigos vienen con un argumento invert:

new_d <- d[grep("K", d$z, invert = TRUE)] 
Cuestiones relacionadas