繁体   English   中英

grep一个字怎么准确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM