2013-11-14 2 views
3

Я пытаюсь совместить символ «+» внутри моей строки, используя функцию pmatch.неожиданное поведение в pmatch при совпадении «+» в R

целевой = "18+"

pmatch ("+" Target)

[1] Н.А.

наблюдаю подобное поведение, если я использую матч или grepl также. Если я попытаюсь использовать gsub, я получаю следующий вывод.

GSUB ("+", "~", Target)

[1] "~ 1 ~ 8 ~ + ~"

Может кто-то пожалуйста, объясните мне причину такого поведения и жизнеспособное решение для моей проблемы

ответ

5

Это перспективный матч. Поэтому он пытается сопоставить "+" с первым символом всех элементов в table (второй аргумент pmatch). Это не удается ("+" != "1"), так возвращается NA. Вы также должны быть осторожны с возвращаемым значением pmatch. Я собираюсь процитировать помощь, потому что он объясняет это лаконично и лучше, чем я когда-либо мог ...

точных совпадений являются предпочтительными для частичного совпадения (те, в которых значение, которое будет соответствовать имеют точное совпадение к начальной части цели, но цель больше).

Если существует точное совпадение или нет точного соответствия и однозначное соответствие , тогда возвращается возвращаемый индекс соответствующего значения; если найдено несколько точных или множественных парциальных совпадений, то 0 возвращается , и если совпадение не найдено, возвращается номач.

###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 
+1

Спасибо, это работает. :) –

1

Попробуйте это:

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

?gsub

фиксированной - логично. Если TRUE, шаблон является строкой, которая будет соответствовать как есть. Переопределяет все конфликтующие аргументы.

+1

может быть также упомянуть, что вы можете избежать '+' 'т.е. GSUB ("\\ +", "~", Target)' 'так +' означает, что что-то в регулярном выражении –

+0

Ok, через это я могу заменить символ «+» с символом «~». Но я все еще не могу заставить его работать с совпадением, pmatch или grepl, если я использую символ ~ в качестве шаблона соответствия. Мне бы очень хотелось знать, почему это происходит. Но пока я могу двигаться вперед с моей работой, я заменил символ «+» на строку и сопоставляю ее. Я знаю, что это не лучший способ написать код, если кто-то может объяснить, почему я не могу сопоставить специальные символы в строке. Это было бы прекрасно. Спасибо :) –

+1

@MayankBansal Я ничего не знаю о 'pmatch', но' gsub' и 'grepl' использовать regex, а в regex' + '- специальный символ, который означает соответствие 1 или больше. Чтобы сбежать из '+' и найти личный '+', вы добавляете '\\' перед этим. –

1

Функция pmatch() попытки соответствовать элементы начало, а не средние части элементы. Итак, проблема там не имеет ничего общего с символом плюса, +.Так, например, первые два исполнения pmatch() дают NA, в результате следующие три дают 1 как результат (указывающий совпадение начала первого элемента).

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

Функция gsub() может быть использована, чтобы соответствовать и замене части элементов с использованием регулярных выражений. Знак плюса имеет особое значение в регулярных выражениях, поэтому вам нужно использовать escape-символы, чтобы указать, что вас интересует знак «плюс» как один символ. Например, следующие три строки кода дают "1~+", "18~" и "~" в качестве результатов соответственно.

gsub("8", "~", Target) 
gsub("\\+", "~", Target) 
gsub("18\\+", "~", Target) 
+1

-1 * Функция pmatch() пытается совместить элементы, а не части элементов *. Это явно неверно. 'pmatch (" 1 "," 18 + ")'. –

+0

Правильно, @ SimonO101. Я редактировал свой пост, чтобы попытаться прояснить и включить ваш пример. Благодарю. –

+0

Я удаляю свой нижний план для вашего редактирования. –

Смежные вопросы