[英]How to grep a word exactly
我想 grep 用于以下字符向量中的“氮”,并且只想取回包含“氮”的条目,而不是 rest(例如固氮):
varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen")
我试过这样的事情:
grepl(pattern= "![[:space:]]nitrogen![[:space:]]", varnames)
但这不起作用。
尽管 Dason 的回答更简单,但您可以通过以下方式使用 grep 进行精确匹配:
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
要获得与“氮”完全相同的指数,您可以使用
which(varnames == "nitrogen")
根据您想要执行的操作,您甚至可能不需要“which”,因为varnames == "nitrogen"
给出了 TRUE/FALSE 的逻辑向量。 如果您只想做一些事情,例如用“氧气”替换所有出现的“氮气”,这就足够了
varnames[varnames == "nitrogen"] <- "oxygen"
或者使用fixed = TRUE
如果你想匹配实际的字符串(较少的regex
):
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
不知道速度问题,我喜欢测试东西并声称方法 A 比方法 B 更快,但理论上,至少根据我的经验,索引/二元运算符应该是最快的,所以我投票支持@Dason 的方法。 另请注意, regex
es总是比fixed = TRUE
grep
ing 慢。
下面附上一点证明。 请注意,这是一个蹩脚的测试, system.time
应该放在replicate
中以获得(更多)准确的差异,你应该考虑异常值等等。但是这个肯定证明你应该使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.