3

我正在尝试使用 pmatch 函数匹配字符串中的“+”符号。

目标=“18+”

pmatch("+",目标)

[1] 不适用

如果我也使用 match 或 grepl,我会观察到类似的行为。如果我尝试使用 gsub,我会得到以下输出。

gsub("+","~",目标)

[1]“~1~8~+~”

有人可以解释一下这种行为的原因以及我的问题的可行解决方案吗

4

3 回答 3

5

这是一场前瞻性的比赛。所以它试图匹配(的第二个参数)"+"中所有元素的第一个字符。这失败了 ( ) 所以返回。您还必须注意 的返回值。我将引用帮助,因为它比我以往任何时候都更简洁和更好地解释它......tablepmatch"+" != "1"NApmatch

精确匹配优于部分匹配(要匹配的值与目标的初始部分完全匹配,但目标更长)。

如果存在单个精确匹配或没有精确匹配且存在唯一部分匹配,则返回匹配值的索引;如果找到多个完全匹配或多个部分匹配,则返回 0,如果未找到匹配,则返回 nomatch。

###Examples from ?pmatch###
#  Multiple partial matches found - returns 0
charmatch("m",   c("mean", "median", "mode")) # returns 0

#  One exact match found - return index of match in table
charmatch("med", c("mean", "median", "mode")) # returns 2

#  One exact match found and preferred over partial match - index of exact match returned
charmatch("med", c("med", "median", "mode")) # returns 1

"+"在您的字符串中获取匹配向量,我会使用grepl...

Target <- c( "+" , "+18" , "18+" , "23+26" , "1234" )
grepl( "\\+" , Target )
# [1]  TRUE  TRUE  TRUE  TRUE FALSE
于 2013-11-14T13:12:25.850 回答
1

尝试这个:

gsub("+","~",fixed=TRUE,Target)

?gsub

固定- 合乎逻辑。如果为 TRUE,pattern 是要按原样匹配的字符串。覆盖所有冲突的参数。

于 2013-11-14T13:03:44.120 回答
1

该函数pmatch()尝试匹配开始元素,而不是元素的中间部分。因此,问题与加号无关,+. 因此,例如,前两次pmatch()giveNA作为结果,接下来的三个 give1作为结果(表示匹配第一个元素的开头)。

Target <- "18+"
pmatch("8", Target)
pmatch("+", Target)
pmatch("1", Target)
pmatch("18", Target)
pmatch("18+", Target)

该函数gsub()可用于使用正则表达式匹配和替换部分元素。加号在正则表达式中具有特殊含义,因此需要使用转义字符来表示您对加号作为单个字符感兴趣。例如,以下三行代码分别给出"1~+", "18~", 和"~"作为结果。

gsub("8", "~", Target)
gsub("\\+", "~", Target)
gsub("18\\+", "~", Target)
于 2013-11-14T13:14:51.623 回答