gsubfn в R, как условно заменить только второй набор чисел в наборе строк - PullRequest
1 голос
/ 20 апреля 2020

Я изо всех сил пытаюсь найти синтаксис для замены только второго набора целых чисел в строке

У меня есть

initpop <- c("a-00-04","a-00-00","a-00-00", "dead", "a-00-00")
 initpop
[1] "a-00-04" "a-00-00" "a-00-00" "dead"    "a-00-00"

Для каждой из строк в этом массиве я бы хотел бы увеличивать последний набор целых чисел на единицу, если значение <4, и сбрасывать на 0, если значение == 4. Я пытаюсь сделать это по частям, но изо всех сил пытаюсь указать второе множество чисел , не оба </p>

gsubfn ("[[: di git:]] +", функция (x) as.numeri c (x) +1, initpop [1]) [ 1] "a-1-1"

Я хотел бы получить ответ:

[1] "a-00-00" "a-00-01" "a-00-01" "dead" "a-00-01"

Я понимаю, что это просто, просто за мной. Какие-либо предложения. Спасибо. J

1 Ответ

2 голосов
/ 20 апреля 2020

Вы можете использовать

gsubfn(
  "^\\D*\\d+\\D*\\K(\\d+)",
  ~ ifelse(as.numeric(x) < 4, sprintf("%02d",as.numeric(x)+1), "00"),
  initpop,
  perl=TRUE
)

Выход:

[1] "a-00-00" "a-00-01" "a-00-01" "dead"    "a-00-01"

Регулярное выражение - ^\D*\d+\D*\K(\d+) анализируется с помощью механизма PCRE (из-за perl=TRUE) и соответствует

  • ^ - начало строки
  • \D* - 0+ не-ди git символов
  • \d+ - 1+ цифр (первый набор цифр )
  • \D* - 0+ нецифров
  • \K - оператор сброса совпадений, отбрасывающий сопоставленный текст
  • (\d+) - Группа 1: один или больше цифр (второй набор).

Часть ~ ifelse(as.numeric(x) < 4, sprintf("%02d",as.numeric(x)+1), "00") является заменой: если x меньше 4, увеличенное значение возвращается с добавлением начальных 0, иначе 00 возвращается Это можно отрегулировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...