首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何准确地grep单词

如何准确地grep单词
EN

Stack Overflow用户
提问于 2012-04-06 17:48:44
回答 3查看 16.8K关注 0票数 8

我想在下面的字符向量中使用grep来表示“N”,并且只想返回包含“N”的条目,而不返回其余的条目(例如,固定氮):

代码语言:javascript
复制
varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen")

我尝试了这样的东西:

代码语言:javascript
复制
grepl(pattern= "![[:space:]]nitrogen![[:space:]]", varnames)

但这不管用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-06 22:54:01

要获得与“N”完全相等的索引,您可以使用

代码语言:javascript
复制
which(varnames == "nitrogen")

根据你想要做什么,你可能甚至不需要‘what’,因为varnames == "nitrogen"给出了一个真/假的逻辑向量。如果您只是想做一些事情,比如将所有出现的“氮”替换为“氧”,这应该就足够了。

代码语言:javascript
复制
varnames[varnames == "nitrogen"] <- "oxygen"
票数 13
EN

Stack Overflow用户

发布于 2012-04-06 19:47:12

尽管Dason的答案更简单,但您可以使用grep via进行精确匹配:

代码语言:javascript
复制
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
票数 14
EN

Stack Overflow用户

发布于 2012-04-07 00:46:44

或者,如果您希望匹配实际字符串(无regex),请使用fixed = TRUE

代码语言:javascript
复制
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的方法。另请注意,regexes的速度始终比fixed = TRUE greping慢。

下面附上一个小小的证明。注意,这是一个差劲的测试,应该将system.time放在replicate中以获得(更)准确的差异,您应该将离群值放入帐户,等等。但这肯定证明了您应该使用which!=)

代码语言:javascript
复制
(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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10041810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档