首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复变量分裂问题的R准则

复变量分裂问题的R准则
EN

Stack Overflow用户
提问于 2018-11-29 22:02:12
回答 1查看 61关注 0票数 1

我有一个代表抗菌药耐药基因变异的data.table变量,所有这些变量都是为每个药物类连在一起的。

我需要为每个基因变异产生一个单独的二进制列,如果某一特定药物类别的基因变异存在,而FALSE不存在,则标记为FALSE

新变量的名称应该采用drugclass_genevariantname格式,其中从原始变量的名称继承药物类,而genevariantname是从使用strsplit的拆分操作中提取的值。

基因变体由一个分号;隔开,因此这是我在以下函数中用来拆分的字符,它将返回data.table,并将新的二进制列添加到末尾:

代码语言:javascript
复制
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

在本例中,我希望创建以下新变量:

  • 药物1_基因1位点1:oldAA-newAA
  • 药物1_基因1位点2:oldAA-newAA
  • 药物1_基因2位点1:oldAA-newAA
  • drug1_gene3v
  • drug1_gene4
  • drug1_gene5

我遇到的困难是在像上面的要点中的第一种和第二种情况下,在原来的字符串中,拆分字符位于方括号内。这导致:

  • Drug1_gene1[位置1:oldAA-newAA]
  • 药物1_位置2:oldAA-newAA]

..。在第二种情况下,变异位置和变异变化已经从发生在其中的基因的名字变成孤儿。

如何修改上述函数以更正新列名,以便:

  1. 在第一个例子中,方括号是封闭的。
  2. 变异的位置和变化总是在基因名称之前。

下面是一些例子数据,说明了这个问题的复杂性:

代码语言:javascript
复制
# 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)中的一个基因在方括号内有两个变体--在拆分操作之后,第二个变体是从基因名中孤立出来的--参见下面:

代码语言:javascript
复制
> 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

任何防止方括号内的第二个(或随后的)变异体与其基因名称分离的解决方案都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-30 19:35:57

关于拆分函数,您可以首先使用如下模式在方括号外的分号处拆分:

代码语言:javascript
复制
;(?=(?:[^\[\]]*\[[^\[\]]*\])*[^\[\]]*$)

然后,在一个附加步骤中拆分具有分号的字符串,例如使用;|\[|\]作为拆分模式。保留第一个结果来拆分并重新构建嵌套值或类似值。

Regex演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53548267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档