Замена данных символов на новые перед определенным параметром в функции gsub - PullRequest
0 голосов
/ 07 января 2019

Я не настолько квалифицирован в R, и я борюсь с проблемой. Я хочу заменить все существующие знаки подчеркивания, которые находятся перед шаблоном "S11", на тире "(-)". S11 - это просто число, и оно является переменной в моей таблице, такой как S29, S30. Вот код, который я использую и терплю неудачу:

foo <- c("H2_2months_S11_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_", "H2_2months_with_acetate_S101_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_", "Formate_3months_S99_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_")
Sample <- gsub(pattern="*(_S)", replacement="-", x=foo)

Получение: [1] "H2_2months-11_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _"
[2] "H2_2months_with_acetate-101_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _" [3] "Formate_3months-99_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _"

Я также не хочу, чтобы "_S" был удален и заменен. Я использую "_S[0-9]" в качестве критерия соответствия, а перед "_S" подчеркивания следует изменить на "-".

Также, пожалуйста, порекомендуйте мне хороший сайт, чтобы я мог выучить эти «коды или знаки», используя эту функцию. Заранее спасибо.

Ожидаемый результат: [1] "H2-2months-S11_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _"
[2] «H2-2месяц с ацетатом-S101_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _» [3] "Formate-3months-S99_L001_R1_001_ (в паре) обрезано (в паре) _contig_940_ [cov = 11] _"

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Это должно работать.

По сути, мы делим работу на две части, сначала сопоставляем ("_(S[0-9+])"), затем разбиваем полученную строку на "-", затем используем gsub, чтобы исправить все найденные "_".

foo <- c("H2_2months_S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_")
foo <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=foo)
#foo
#[1] "H2_2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"

Тогда мы разделим:

split <- unlist(strsplit(foo, "-")) # split using the new "-"
#split
#[1] "H2_2months"                                                     
#[2] "S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"

Теперь мы можем использовать простой gsub для всего, кроме последнего элемента в split.

split_1 <- split[-length(split)] # fix all the "_" before the match (exclude the last)
split_1 <- gsub("_", "-", split_1)

Тогда мы paste Результаты:

paste0(split_1, "-", split[length(split)]) # paste back together
#[1] "H2-2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"

Здесь, в функции и другом примере:

foo <- c("H2_2months_abc_456_S123_L001_R1_001")

my_foo <- function(s) {
  s <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=s)
  split <- unlist(strsplit(s, "-"))

  split_1 <- split[-length(split)]
  split_1 <- gsub("_", "-", split_1)

  paste0(split_1, "-", split[length(split)])
}

my_foo(foo)
#[1] "H2-2months-abc-456-S123_L001_R1_001"
0 голосов
/ 07 января 2019

Это будет соответствовать "_S11" и сохранить S11 в группу. Затем замените это на «-», за которым следует захваченная группа «S11».

Sample <- gsub("_(S[0-9+])", "-\\1", foo)

Отличное место, чтобы узнать больше регулярных выражений: https://www.regular -expressions.info / quickstart.html

Отличное место для проверки регулярных выражений с объяснениями соответствия: https://regexr.com/

Редактировать: Спасибо RLave, не понял, что это могут быть какие-либо цифры после S. Обновленный ответ.

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