2012-04-06 12 views
7

Aşağıdaki karakter vektörü "azot" için grep istiyorum ve geri sadece "azot" içeren giriş ve geri kalanı (örneğin azot fiksasyon):R statistics: Tam olarak bir kelime grep nasıl

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

böyle bir şey denedim:

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

Ancak bu işe yaramaz. Umarım birileri bana bu görevde yardımcı olabilir.

+8

Yani sadece "azot" tam olarak eşit değerlerin indeksini/endekslerini mi istiyorsunuz? Hangi (varnames == "azot") 'istediğinizi verir mi? – Dason

+0

Çok teşekkür ederim, tam da ihtiyacım olan şey bu. – sabsirro

+0

Dason: Yorumunuzu Sabsirro'nun kabul edebileceği bir cevap verebilir misiniz? –

cevap

13

Ne yapmak istediğinize, varnames == "nitrogen"'un DOĞRU/YANLIŞ mantıksal bir vektörünü verdiğine 'hangisinin' gerek duymayabilirsiniz. Sadece "Oksijen" ile "azot" nin oluşumları tüm değiştirmek gibi bir şey yapmak istiyorsanız bu

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

Dason cevabı daha kolay olsa da, üzerinden grep kullanarak tam bir eşleşme yapabilirdi: "azot" Eğer

which(varnames == "nitrogen") 

bağlı kullanabilirsiniz tam eşittir indeksleri almak için

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

Danson'un cevabı sadece daha kolay değil, aynı zamanda daha hızlı. –

+0

Evet, bu da işe yarıyor. Teşekkür ederim. – sabsirro

+0

Çalışıyor, ancak yavaş. 'Regex' dinamik olarak inşa etmedikçe, '^ someword $' yapmanın hiçbir anlamı yoktur. – aL3xa

2

yeterli olacaktır Yoksa (lessly regex) gerçek dize eşleştirmek istiyorsanız, fixed = TRUE kullanın:

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 

Hız sorunları hakkında Dunno, bir şeyleri test etmeyi seviyorum ve A yaklaşımının B yaklaşımından daha hızlı olduğunu iddia ediyorum, fakat teoride, en azından deneyimimden, indeksleme/ikili operatörler en hızlı olmalı, bu yüzden @ Dason'a oy veriyorum yaklaşım. Ayrıca, regex eslerinin fixed = TRUEgrep ing öğesinden her zaman daha yavaş olduğunu unutmayın.

Küçücük bir kanıt eklenmiştir. Bu bir topal test olduğunu ve system.timereplicate içine koymak (daha) doğru farklılıklar almak için, bir hesap içine aykırı almak gerekir, vb Ama kesinlikle bu bir which kullanmanız gerektiğini kanıtlıyor! =)

(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

O, bu detaylı cevap için tanklar. Bu farklılıkları bilmek güzel. – sabsirro