或者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