2012-04-06 34 views
7

Tôi muốn grep cho "nitơ" trong vector ký tự sau và muốn lấy chỉ quay lại mục nhập có chứa "nitơ" và không có phần còn lại (ví dụ: nitơ cố định):R thống kê: Cách grep một từ chính xác

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

tôi đã cố gắng một cái gì đó như thế này:

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

Nhưng điều này không làm việc. Tôi hy vọng ai đó có thể giúp tôi với nhiệm vụ này.

+8

Vì vậy, bạn chỉ muốn chỉ mục/chỉ mục của các giá trị chính xác bằng "nitơ"? Có 'mà (varnames ==" nitơ ")' cung cấp cho bạn những gì bạn muốn? – Dason

+0

Cảm ơn bạn rất nhiều đó là chính xác những gì tôi cần. – sabsirro

+0

Dason: bạn có thể làm cho bình luận của bạn một câu trả lời để Sabsirro có thể chấp nhận? –

Trả lời

13

Để có được các chỉ số đó là chính xác bằng "nitơ" bạn có thể sử dụng

which(varnames == "nitrogen") 

Tuỳ về những gì bạn muốn làm bạn thậm chí có thể không cần 'cái' là varnames == "nitrogen" cho một vectơ lôgic của TRUE/FALSE. Nếu bạn chỉ muốn làm một cái gì đó giống như thay thế tất cả các lần xuất hiện của "nitơ" với "oxy" này nên đủ

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

Mặc dù câu trả lời Dason là dễ dàng hơn, bạn có thể làm một kết hợp chính xác sử dụng grep qua:

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

Câu trả lời của Danson không chỉ dễ dàng hơn, nó cũng nhanh hơn. –

+0

Vâng điều này cũng hoạt động. Cảm ơn bạn. – sabsirro

+0

Nó hoạt động, nhưng nó chậm. Trừ khi bạn đang xây dựng 'regex' động, không có nhiều ý nghĩa khi thực hiện'^someword $ '. – aL3xa

2

Hoặc sử dụng fixed = TRUE nếu bạn muốn kết hợp chuỗi thực tế (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 

Dunno về vấn đề tốc độ, tôi thích kiểm tra và tuyên bố rằng phương pháp A nhanh hơn phương pháp B, nhưng theo lý thuyết, ít nhất là từ kinh nghiệm của tôi, lập chỉ mục/toán tử nhị phân phải là nhanh nhất, vì vậy tôi bỏ phiếu cho @ Dason's tiếp cận. Cũng lưu ý rằng regex es là luôn luôn chậm hơn fixed = TRUEgrep ing.

Một bằng chứng nhỏ được đính kèm dưới đây. Lưu ý rằng đây là một thử nghiệm lame, và system.time nên được đặt bên trong replicate để có được (nhiều hơn) sự khác biệt chính xác, bạn nên đưa ra ngoài một tài khoản, vv Nhưng chắc chắn điều này chứng minh rằng bạn nên sử dụng 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

Anh ta, xe tăng cho câu trả lời chi tiết đó. Nó là tốt để biết về sự khác biệt này. – sabsirro

Các vấn đề liên quan