Как редактировать несколько шаблонов, используя gsub - PullRequest
0 голосов
/ 28 июня 2019

Я хотел бы добавить - между конкретными строками в моем столбце данных.

Этот столбец содержит строки, такие как:

mmu-let-7a3
mmu-miR-19b1
mmu-miR-548d2
mmu-miR-450a1

* - должен находиться между последним алфавитным символом, но только если последний алфавитный символ является определенно a, b, c илиd и последний числовой символ, но опять-таки, только если последний числовой символ равен 1, 2 или 3.

Вывод должен выглядеть следующим образом

mmu-let-7a-3
mmu-miR-19b-1
mmu-miR-548d-2
mmu-miR-450a-1

Существует ли код регулярного выражения, которыйможно сделать это с помощью gsub?Или другая функция?

Буду признателен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 28 июня 2019
# let
x <- c("mmu-let-7a3", "mmu-miR-19b1", "mmu-miR-548d2", "mmu-miR-450a1", "mmu-miR-450g4")

sub("([a-d])([1-3])$", "\\1-\\2", x)
[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2" "mmu-miR-450a-1" "mmu-miR-450g4" 
2 голосов
/ 28 июня 2019

Мы можем сделать:

test <- "mmu-miR-450a1"
gsub("([a-d])([1-3])$","\\1-\\2",test)
[1] "mmu-miR-450a-1"

Или с stringr:

stringr::str_replace_all(x,
   "([a-d])([1-3])$","\\1-\\2")
[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2"
[4] "mmu-miR-450a-1"
2 голосов
/ 28 июня 2019

Существуют различные способы для достижения этой цели, но, поскольку вы упоминаете (g)sub, здесь есть вариант, использующий позитивный взгляд

sub("(?<=[a-d])([1-3])$", "-\\1", x, perl = T)
#[1] "mmu-let-7a-3"   "mmu-miR-19b-1"  "mmu-miR-548d-2" "mmu-miR-450a-1"

Или используя две группы захвата

sub("([a-d])([1-3])$", "\\1-\\2", x)

Объяснение:

  • [a-d] соответствует буквам "a", "b", "c", "d"
  • [1-3]$ соответствует "1", "2", "3" в конце строки (из-за привязки конца строки $)

Пример данных

x <- c("mmu-let-7a3",
"mmu-miR-19b1",
"mmu-miR-548d2",
"mmu-miR-450a1")
...