3

pmatch 関数を使用して、文字列内の「+」記号を一致させようとしています。

対象=「18歳以上」

pmatch("+",ターゲット)

[1] 該当なし

match または grepl も使用すると、同様の動作が観察されます。gsub を使用しようとすると、次の出力が得られます。

gsub("+","~",対象)

[1]「~1~8~+~」

誰かがこの動作の理由と私の問題に対する実行可能な解決策を説明してくれませんか

4

3 に答える 3

5

前向きな試合です。そのため、 (の 2 番目の引数)"+"内のすべての要素の最初の文字に一致しようとします。これは失敗 ( ) であるため、返されます。の戻り値にも注意が必要です。ヘルプから引用します。これは、これまで以上に簡潔に説明されているためです...tablepmatch"+" != "1"NApmatch

完全一致は、部分一致(一致する値がターゲットの最初の部分と完全に一致しているが、ターゲットが長い場合) よりも優先されます。

完全一致が 1 つある場合、または完全一致がなく、一意の部分一致がある場合は、一致する値のインデックスが返されます。複数の完全一致または複数の部分一致が見つかった場合は 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 の場合、パターンはそのまま照合される文字列です。競合するすべての引数をオーバーライドします。

于 2013-11-14T13:03:44.120 に答える
1

この関数pmatch()は、要素の中間部分ではなく、最初の要素を照合しようとします。したがって、問題はプラス記号とは何の関係もありません+。したがって、たとえば、最初の 2 回の Give の実行は結果として返され、次の 3 回の実行は結果として返されpmatch()ます(最初の要素の先頭の一致を示します)。NA1

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

この関数gsub()を使用して、正規表現を使用して要素の一部を照合および置換できます。プラス記号は正規表現で特別な意味を持つため、エスケープ文字を使用して、プラス記号を 1 文字として使用することに関心があることを示す必要があります。たとえば、次の 3 行のコードは、結果としてそれぞれ"1~+""18~"、およびを返します。"~"

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