r регулярное выражение для сложной задачи расщепления переменных - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть data.table переменных, представляющих варианты генов устойчивости к противомикробным препаратам, которые все объединены для каждого класса препаратов.

Мне нужно создать отдельный двоичный столбец для каждого варианта гена, помеченный как TRUE если присутствует генный вариант для данного класса лекарственного средства, а FALSE в противном случае.

Имена новых переменных должны быть в формате drugclass_genevariantname, где drugclass наследуется от имени исходной переменной и имени генварианта.является значением, извлеченным из операции разделения с помощью strsplit.

Варианты гена разделяются точкой с запятой ;, так что это символ, который я использовал для разделения в следующей функции, которая будетвернуть data.table с новыми двоичными столбцами, добавленными в конец:

getamr <- function(dt, amrcol, splitchar) {

    columnvector = dt[[amrcol]]

    if (all(is.na(columnvector))) {return(dt)}

    y = unique(unlist(strsplit(x = columnvector, split = splitchar)))

    y = sort(y)

    for (i in 1:length(y)) {

      dt[, noquote(paste0(amrcol, "_", y[i])) :=
           ifelse(grepl(y[i], columnvector, fixed = TRUE), TRUE, FALSE)]
    }

    return(dt)

  }

Эта функция отлично работает для создания новых столбцов и определения наличия или отсутствия каждого варианта гена.Однако имена вариантов гена не назначаются новым переменным правильно из-за сложного формата, который выглядит примерно так:

gene1 [position1: oldAA-newAA; position2: oldAA-newAA]; gene2 [position1: oldAA-newAA]; gene3 [v]; gene4; gene5

В этом примере можно ожидать создания следующих новых переменных:

  • drug1_gene1 [position1: oldAA-newAA]

  • drug1_gene1 [position2: oldAA-newAA]

  • drug1_gene2 [position1: oldAA-newAA]

  • drug1_gene3 [v]

  • drug1_gene4

  • drug1_gene5

Трудность, с которой я сталкиваюсь, заключается в ситуациях, подобных первому и второму случаю в пунктах выше, где в исходной строке символ разделения находится в квадратных скобках.Это приводит к:

  • drug1_gene1 [position1: oldAA-newAA

  • drug1_position2: oldAA-newAA]

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

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

  1. квадратные скобки были закрыты в примерах, таких как первый случай
  2. вариант позиции и изменения всегда предшествуют имени гена

Ниже приведен пример данных, иллюстрирующих сложность этой проблемы:

# Load data.table:
library(data.table)

# Create example data:
mydt <- data.table(id = c(1,2,3,4,5), 
                 amr_drug1 = c("erm(B)[v];mdf(A)*;mph-(A)*;strA;sat2A", "mdf(A)*;strA;sat2A", "-", "erm(B)[v];mdf(A)*;mph-(A)*;strA;sat2A", "-"), 
                 amr_drug2 = c("-", "aph(6)-Id,strB[v]", "aph(6)-Id,strB[v]", "aph(6)-Id,strB[v]", "-"), 
                 amr_drug3 = c("gyrA_EC2[83:S-L]", "gyrA_EC2[83:S-L;87:D-N];parC_EC2[80:S-I]", "gyrA_EC2[83:S-L;87:D-N];parC_EC2[80:S-I]", "gyrA_EC2[83:S-L]", "-"), 
                 amr_drug4 = c("OXA-1", "OXA-1", "OXA-1", "OXA-1", "OXA-1"),
                 amr_drug5 = c("-", "-", "-", "-", "-"))


# Identify AMR columns:
amrcols <- grep("^amr", names(mydt), value = TRUE)

# Replace '-' with NA:
mydt[, c(amrcols) := lapply(.SD, function(x) ifelse(x == "-", NA_character_, x)), .SDcols = amrcols]

# Apply function across all AMR columns:
for (i in 1:length(amrcols)) { getamr(mydt, amrcols[i], ";") } 

Один из генов в третьем столбце amr (gyrA_EC2) имеет два варианта, заключенные в квадратные скобки - после разделенияОперация, второй вариант потерян из имени гена - см. ниже:

> mydt
   id                             amr_drug1         amr_drug2                                amr_drug3 amr_drug4 amr_drug5
1:  1 erm(B)[v];mdf(A)*;mph-(A)*;strA;sat2A              <NA>                         gyrA_EC2[83:S-L]     OXA-1      <NA>
2:  2                    mdf(A)*;strA;sat2A aph(6)-Id,strB[v] gyrA_EC2[83:S-L;87:D-N];parC_EC2[80:S-I]     OXA-1      <NA>
3:  3                                  <NA> aph(6)-Id,strB[v] gyrA_EC2[83:S-L;87:D-N];parC_EC2[80:S-I]     OXA-1      <NA>
4:  4 erm(B)[v];mdf(A)*;mph-(A)*;strA;sat2A aph(6)-Id,strB[v]                         gyrA_EC2[83:S-L]     OXA-1      <NA>
5:  5                                  <NA>              <NA>                                     <NA>     OXA-1      <NA>
   amr_drug1_erm(B)[v] amr_drug1_mdf(A)* amr_drug1_mph-(A)* amr_drug1_sat2A amr_drug1_strA amr_drug2_aph(6)-Id,strB[v]
1:                TRUE              TRUE               TRUE            TRUE           TRUE                       FALSE
2:               FALSE              TRUE              FALSE            TRUE           TRUE                        TRUE
3:               FALSE             FALSE              FALSE           FALSE          FALSE                        TRUE
4:                TRUE              TRUE               TRUE            TRUE           TRUE                        TRUE
5:               FALSE             FALSE              FALSE           FALSE          FALSE                       FALSE
   amr_drug3_87:D-N] amr_drug3_gyrA_EC2[83:S-L amr_drug3_gyrA_EC2[83:S-L] amr_drug3_parC_EC2[80:S-I] amr_drug4_OXA-1
1:             FALSE                      TRUE                       TRUE                      FALSE            TRUE
2:              TRUE                      TRUE                      FALSE                       TRUE            TRUE
3:              TRUE                      TRUE                      FALSE                       TRUE            TRUE
4:             FALSE                      TRUE                       TRUE                      FALSE            TRUE
5:             FALSE                     FALSE                      FALSE                      FALSE            TRUE

Любые решения для предотвращения разделения второго (или последующих) вариантов внутри квадратных скобок fот их имени гена очень ценились бы.

1 Ответ

0 голосов
/ 30 ноября 2018

Относительно функции разделения, вы можете сначала разбить только на точки с запятой за пределами квадратных скобок, используя шаблон, подобный следующему:дополнительный шаг, например, используя ;|\[|\] в качестве шаблона разделения.Сохраните первый результат, чтобы разбить и перестроить вложенные значения или аналогичные.

Демонстрация регулярных выражений

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