У меня есть 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
Трудность, с которой я сталкиваюсь, заключается в ситуациях, подобных первому и второму случаю в пунктах выше, где в исходной строке символ разделения находится в квадратных скобках.Это приводит к:
... что больше не имеет смысла, так как во втором случае изменения варианта и изменения варианта были потеряны от имени гена, в котором они происходят.
Как мне изменить вышеуказанную функциюисправить имена новых столбцов так, чтобы:
- квадратные скобки были закрыты в примерах, таких как первый случай
- вариант позиции и изменения всегда предшествуют имени гена
Ниже приведен пример данных, иллюстрирующих сложность этой проблемы:
# 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от их имени гена очень ценились бы.