Использовать несколько обратных ссылок в функции для получения значения замены в функциях stringr в R - PullRequest
0 голосов
/ 08 февраля 2019

Как я могу использовать несколько обратных ссылок в функции, чтобы произвести замену в stringr функциях, например, в stringr::str_replace()?

Пример: предположим, что я хочу, чтобы замена была округлена до целого числа и объединена в одну строку (эта конкретная функция является лишь примером, важно то, что она принимает> 1 обратную ссылку)

Я безуспешно пробовал некоторые варианты следующего:

round_concat <- function(x, y) { paste(round(as.numeric(x),0), round(as.numeric(y, 0)))}

library(stringr)
"ABC 23.3 text 105.43 more text" %>% str_replace_all(., "(\\d+)(\\.)(\\d+)", round_concat("\\1", "\\2"))

Примечание. Я искал аналогичные функции в таких функциях, как base::gsub (см. здесь ), но без удачи

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Это то, чем я в конечном итоге воспользовался (хотя мне все равно хотелось бы знать, можно ли использовать несколько * обратных ссылок в stringr::str_replace()).

Важно, что приведенное ниже решение позволяет предоставить несколько обратных ссылок для функции замены

library(gsubfn)
"This string 24.45,32 contains numbers 67.0.5,150 lots of them" %>% 
  gsubfn("(\\d+)\\.(\\d+),(\\d+)",  ~ { paste(as.numeric(x) * 2,  as.numeric(y) * 0.5,  as.numeric(z) + 7 ) }, . , backref = -3)

# [1] "This string 48 22.5 39 contains numbers"

Здесь следует отметить несколько вещей:

  • x, y и z предоставляются для замены, вы можете называть их как хотите
  • x, y и z просто представляют каждую из регулярных выражений групп захвата
  • backref = -3 говорит gsubfn() ожидать 3 обратных ссылок, но не самого совпадения (см. здесь )
  • Изменение -3 на 3будет означать, что gsubfn() будет ожидать, что вы тоже что-то сделаете с соответствием, в противном случае выдается ошибка неиспользованного аргумента
  • В приведенном выше примере используется 3 аргумента, но вы можете использовать столько, сколько захотите
  • Вы можете назвать аргументы как хотите;они будут доступны функции в любом порядке, в котором они появляются в группировках захвата (т. е. ()) в регулярном выражении
  • , не забывайте ~
0 голосов
/ 08 февраля 2019

Если вы хотите применить функцию к обратному отзыву замены, вы можете сделать:

prices %>% str_replace_all(., "(\\d+\\.\\d+)", function(x){round(as.numeric(x))})

Пример:

prices = c("tomato: 12.23","potato: 9.53")
prices %>% str_replace_all(., "(\\d+\\.\\d+)", function(x){round(as.numeric(x))})

[1] "tomato: 12" "potato: 10"

В этом случае замена сначала преобразуется в числои округляется до ближайшего целого числа.

Или даже:

str_replace_all(prices, "(\\d+\\.\\d+)", function(x){ nchar(x) })
[1] "tomato: 5" "potato: 4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...