8

我想在以下字符向量中 grep 查找“nitrogen”,并且只想取回包含“nitrogen”的条目,而其余的则一无所有(例如固氮):

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

我试过这样的事情:

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

但这不起作用。

4

3 回答 3

14

尽管 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
于 2012-04-06T11:47:11.757 回答
13

要获得完全等于“氮”的指数,您可以使用

which(varnames == "nitrogen")

根据您想要做什么,您甚至可能不需要“which”,因为varnames == "nitrogen"它给出了 TRUE/FALSE 的逻辑向量。如果你只是想做一些事情,比如用“氧”替换所有出现的“氮”,这就足够了

varnames[varnames == "nitrogen"] <- "oxygen"
于 2012-04-06T14:54:00.717 回答
2

或者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 的方法。还要注意regexes总是fixed = TRUE greping 慢。

下面附上一个小证明。请注意,这是一个蹩脚的测试,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 
于 2012-04-06T16:46:44.237 回答