2012-04-06 19 views
7

Vorrei grep per "azoto" nel seguente carattere vettore e voglio ottenere indietro solo la voce che contiene "azoto" e nulla del resto (ad esempio azoto fissazione):R statistiche: Come grep una parola esattamente

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

ho provato qualcosa di simile:

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

Ma questo non funziona. Spero che qualcuno possa aiutarmi con questo compito.

+8

Quindi si desidera solo l'indice/gli indici dei valori esattamente uguali a "azoto"? Does 'which (varnames ==" azogen ")' ti dà quello che vuoi? – Dason

+0

Grazie mille che è esattamente ciò di cui ho bisogno. – sabsirro

+0

Dason: puoi rendere il tuo commento una risposta in modo che Sabsirro possa accettare? –

risposta

13

Per ottenere gli indici che sono esattamente uguale a "azoto" si potrebbe usare

which(varnames == "nitrogen") 

seconda su ciò che si vuole fare si potrebbe anche non essere necessario il 'che' come varnames == "nitrogen" dà un vettore logico VERO/FALSO. Se si desidera solo per fare qualcosa di simile sostituire tutti i occorrenze di "azoto" con "ossigeno" questo dovrebbe bastare

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

Anche se la risposta di Dason è più facile, si potrebbe fare una corrispondenza esatta utilizzando grep tramite:

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 risposta di Danson non è solo più semplice, ma anche più veloce. –

+0

Sì, anche questo funziona. Grazie. – sabsirro

+0

Funziona, ma è lento. A meno che non stiate costruendo 'regex'es in modo dinamico, non ha molto senso fare'^someword $'. – aL3xa

2

Oppure utilizzare fixed = TRUE se si desidera far corrispondere stringa effettiva (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 

Boh sui problemi di velocità, mi piace provare cose e sostengono che l'approccio a è più veloce di metodo B, ma in teoria, almeno dalla mia esperienza, indicizzazione/operatori binari dovrebbe essere il più veloce, in modo da votare per @ Dason di approccio. Si noti inoltre che regex es sono sempre più lento di fixed = TRUEgrep ing.

Un po 'la prova è attaccato sotto. Si noti che questo è un test zoppo, e system.time dovrebbe essere messo dentro replicate per ottenere (altri) differenze precisi, si dovrebbe prendere valori anomali in un account, ecc Ma certamente questo dimostra che si dovrebbe usare 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

Lui, carri armati per quella risposta dettagliata. È bene conoscere queste differenze. – sabsirro