Использование амперсанда (&) внутри функции gsub R для замены шаблона (обратная ссылка на группу захвата) - PullRequest
1 голос
/ 27 июня 2019

Мне нужно добавить префикс к некоторым элементам в векторе, которые соответствуют специальному шаблону.

Внутри sed Unix команда ampersand имеет особое значение (обратная ссылка на группу захвата), и я 'Я пытаюсь получить подобную функциональность в функции gsub R.

# create a small exemple
v1=c(1:10,"D")
# perform the command to add a preffix to vector elements
gsub("^[0-9]+","X.\\&",v1)

Вывод, который я получил:

[1] "X.&" "X.&" "X.&" "X.&" "X.&" "X.&" "X.&" "X.&" "X.&" "X.&" "D"

Вывод, который я хочу:

[1] "X.1" "X.2" "X.3" "X.4" "X.5" "X.6" "X.7" "X.8" "X.9" "X.10" "D"

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Похоже, вы ищете концепцию группы захвата и обратная ссылка .

Цитирование руководства BSD sed

Амперсанд ('&'), появляющийся при замене, заменяется строкой, соответствующей RE.Особое значение «&» в этом контексте можно подавить, поставив перед ним обратную косую черту.Строка '\ #', где '#' - это цифра, заменяется текстом, которому соответствует соответствующее выражение обратной ссылки

R не поддерживает версию &, но поддерживает \#.
С ?regex

Обратная ссылка \ N, где N = 1 ... 9, соответствует подстроке, предварительно сопоставленной N-му подвыражению в скобках регулярного выражения

Так что вы могли бы сделать

gsub("^([0-9]+)","X.\\1", v1)
#  [1] "X.1"  "X.2"  "X.3"  "X.4"  "X.5"  "X.6"  "X.7"  "X.8"  "X.9"  "X.10" "D" 
1 голос
/ 27 июня 2019

Вы также можете использовать обратные ссылки в регулярных выражениях R.Вам нужно только сгруппировать ваш шаблон, используя скобки:

gsub("(^[0-9]+)","X.\\1",v1)
...