我想在下面的字符向量中使用grep来表示“N”,并且只想返回包含“N”的条目,而不返回其余的条目(例如,固定氮):
varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen")我尝试了这样的东西:
grepl(pattern= "![[:space:]]nitrogen![[:space:]]", varnames)但这不管用。
发布于 2012-04-06 22:54:01
要获得与“N”完全相等的索引,您可以使用
which(varnames == "nitrogen")根据你想要做什么,你可能甚至不需要‘what’,因为varnames == "nitrogen"给出了一个真/假的逻辑向量。如果您只是想做一些事情,比如将所有出现的“氮”替换为“氧”,这应该就足够了。
varnames[varnames == "nitrogen"] <- "oxygen"发布于 2012-04-06 19:47:12
尽管Dason的答案更简单,但您可以使用grep via进行精确匹配:
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-07 00:46:44
或者,如果您希望匹配实际字符串(无regex),请使用fixed = TRUE:
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 https://stackoverflow.com/questions/10041810
复制相似问题