2012-04-06 8 views
7

Ich würde gerne für "Stickstoff" in den folgenden Zeichenvektor grep und wollen nur den Eintrag zurück, der "Stickstoff" und nichts von dem Rest enthält (zB Stickstoff Fixierung): R Statistik: Wie ein Wort genau grep

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

ich habe versucht, so etwas wie dieses:

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

Aber das funktioniert nicht. Ich hoffe, dass mir jemand bei dieser Aufgabe helfen kann.

+8

Also wollen Sie nur den Index/Indizes der Werte, die genau "Stickstoff" gleich? Gibt 'was (varnames ==" stickstoff ")' dir was du willst? – Dason

+0

Vielen Dank, das ist genau das, was ich brauche. – sabsirro

+0

Dason: Kannst du deinen Kommentar so beantworten, dass Sabsirro das akzeptieren kann? –

Antwort

13

die Indizes zu erhalten, die genau gleich „Stickstoff“ sind, könnten Sie

which(varnames == "nitrogen") 

verwenden Je Was Sie tun wollen, brauchen Sie vielleicht nicht einmal das 'was', da varnames == "nitrogen" einen logischen Vektor von TRUE/FALSE ergibt. Wenn Sie nur etwas tun wollen wie alle der Vorkommen von „Stickstoff“ mit „Sauerstoff“ ersetzen sollte

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

Obwohl Dason Antwort einfacher ist, könnten Sie eine genaue Übereinstimmung tun grep über:

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

Dansons Antwort ist nicht nur einfacher, sondern auch schneller. –

+0

Ja, das funktioniert auch. Vielen Dank. – sabsirro

+0

Es funktioniert, aber es ist langsam. Es sei denn, Sie bauen 'regex's dynamisch auf, es macht keinen Sinn,'^irgendwas $ 'zu machen. – aL3xa

2

genügen Oder fixed = TRUE verwenden, wenn Sie tatsächlich string (regex lessly) übereinstimmen soll:

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 

Keine Ahnung über die Geschwindigkeitsprobleme, ich mag Sachen testen und dieser Ansatz A Anspruch ist schneller als Ansatz B, aber in der Theorie, zumindest aus meiner Erfahrung, Indexierung/Binäroperatoren sollten die schnellste sein, so dass ich stimme für @ Dason des Ansatz. Beachten Sie auch, dass regex es sind immer langsamer als fixed = TRUEgrep ing.

Ein kleiner Beweis unten angebracht. Beachten Sie, dass dies ein lahmer Test ist, und system.time sollte innerhalb replicate gesetzt wird (mehr) genaue Unterschiede zu erhalten, sollten Sie Ausreißer auf ein Konto übernehmen, etc. Aber sicherlich dies beweist, dass Sie which verwenden sollen! =)

(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

Er, Tanks für diese detaillierte Antwort. Es ist gut, über diese Unterschiede Bescheid zu wissen. – sabsirro