我有一个代表抗菌药耐药基因变异的data.table变量,所有这些变量都是为每个药物类连在一起的。
我需要为每个基因变异产生一个单独的二进制列,如果某一特定药物类别的基因变异存在,而FALSE不存在,则标记为FALSE。
新变量的名称应该采用drugclass_genevariantname格式,其中从原始变量的名称继承药物类,而genevariantname是从使用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)
}该函数可以很好地创建新列并识别每个基因变异是否存在。然而,由于复杂的格式,基因变体的名称没有被正确地分配给新变量,这类似于:
gene1position1:oldAA-newAA;position2:oldAA-newAA;gene2position1:oldAA-newAA;gene3v;gene4;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任何防止方括号内的第二个(或随后的)变异体与其基因名称分离的解决方案都是非常感谢的。
发布于 2018-11-30 19:35:57
关于拆分函数,您可以首先使用如下模式在方括号外的分号处拆分:
;(?=(?:[^\[\]]*\[[^\[\]]*\])*[^\[\]]*$)然后,在一个附加步骤中拆分具有分号的字符串,例如使用;|\[|\]作为拆分模式。保留第一个结果来拆分并重新构建嵌套值或类似值。
https://stackoverflow.com/questions/53548267
复制相似问题