2012-04-06 11 views
7

Me gustaría grep para "nitrógeno" en el siguiente vector de caracteres y quiero obtener de nuevo solo la entrada que contiene "nitrógeno" y nada del resto (por ejemplo, nitrógeno fijación):Estadísticas R: Cómo grep una palabra exactamente

varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen") 

he intentado algo como esto:

grepl(pattern= "![[:space:]]nitrogen![[:space:]]", varnames) 

Pero esto no funciona. Espero que alguien pueda ayudarme con esta tarea.

+8

¿Entonces solo desea el índice/índices de los valores que son exactamente iguales a "nitrógeno"? ¿'Which (varnames ==" nitrogen ")' te da lo que quieres? – Dason

+0

Muchas gracias, eso es exactamente lo que necesito. – sabsirro

+0

Dason: ¿puedes responder a tu comentario para que Sabsirro pueda aceptarlo? –

Respuesta

13

Para obtener los índices que son exactamente igual a "nitrógeno" se puede utilizar

which(varnames == "nitrogen") 

Dependiendo en lo que desea hacer puede que ni siquiera necesite el 'que' como varnames == "nitrogen" da un vector lógico de VERDADERO/FALSO. Si lo que desea es hacer algo como reemplazar todas las ocurrencias de "nitrógeno" con "oxígeno" esto debería ser suficiente

varnames[varnames == "nitrogen"] <- "oxygen" 
14

Aunque la respuesta de Dason es más fácil, se puede hacer una coincidencia exacta usando grep a través de:

varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen") 

grep("^nitrogen$",varnames,value=TRUE) 
[1] "nitrogen" 

grep("^nitrogen$",varnames) 
[1] 1 
+2

La respuesta de Danson no es solo más fácil, también es más rápida. –

+0

Sí, esto también funciona. Gracias. – sabsirro

+0

Funciona, pero es lento. A menos que esté construyendo 'regex'es dinámicamente, no tiene mucho sentido hacer'^someword $ '. – aL3xa

2

O utilice fixed = TRUE si desea hacer coincidir cadena real (regex lessly):

v <- sample(c("nitrogen", "potassium", "hidrogen"), size = 100, replace = TRUE, prob = c(.8, .1, .1)) 
grep("nitrogen", v, fixed = TRUE) 
# [1] 3 4 5 6 7 8 9 11 12 13 14 16 19 20 21 22 23 24 25 
# [20] 26 27 29 31 32 35 36 38 39 40 41 43 44 46 47 48 49 50 51 
# [39] 52 53 54 56 57 60 61 62 65 66 67 69 70 71 72 73 74 75 76 
# [58] 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96 97 
# [77] 98 99 100 

No sé lo de velocidad, me gusta probar cosas y afirmar que el enfoque A es más rápido que el enfoque B, pero en teoría, al menos según mi experiencia, los operadores de indexación/binarios deberían ser los más rápidos, así que voto por @Dason enfoque. También tenga en cuenta que regex es son siempre más lento que fixed = TRUEgrep ing.

Se adjunta una pequeña prueba. Tenga en cuenta que esta es una prueba coja, y system.time debe colocarse dentro de replicate para obtener (más) diferencias precisas, debe tomar valores atípicos en una cuenta, etc. ¡Pero seguramente esto demuestra que debe usar which! =)

(a0 <- system.time(replicate(1e5, grep("^nitrogen$", v)))) 
# user system elapsed 
# 5.700 0.023 5.724 
(a1 <- system.time(replicate(1e5, grep("nitrogen", v, fixed = TRUE)))) 
# user system elapsed 
# 1.147 0.020 1.168 
(a2 <- system.time(replicate(1e5, which(v == "nitrogen")))) 
# user system elapsed 
# 1.013 0.020 1.033 
+0

Él, tanques para esa respuesta detallada. Es bueno saber acerca de estas diferencias. – sabsirro

Cuestiones relacionadas