複素変数分割問題の正規表現

エイミーM

私は、data.table抗菌薬耐性遺伝子変異体を表す変数をいくつか持っています。これらはすべて、薬剤クラスごとに連結されています。

TRUE特定の薬剤クラスの遺伝子バリアントが存在するかのようにマークされた、遺伝子バリアントごとに個別のバイナリ列を作成する必要がありFALSEます。

新しい変数の名前は、drugclass_genevariantnameの形式にする必要があります。ここで、drugclassは元の変数の名前から継承され、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)

  }

この関数は、新しい列を作成し、各遺伝子バリアントが存在するかどうかを識別するために正常に機能します。ただし、次のような複雑な形式のため、遺伝子バリアントの名前が新しい変数に正しく割り当てられていません。

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

私が抱えている問題は、上記の箇条書きの1番目と2番目のケースのように、元の文字列では分割文字が角かっこ内にある場合です。これにより、次のようになります。

  • Drug1_gene1 [position1:oldAA-newAA

  • Drug1_position2:oldAA-newAA]

... 2番目のケースのように意味がなくなったため、バリアントの位置とバリアントの変更は、それらが発生する遺伝子の名前から孤立しています。

上記の関数を変更して、新しい列名を次のように修正するにはどうすればよいですか。

  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], ";") } 

3番目のamr列の遺伝子の1つ(gyrA_EC2)には、角括弧で囲まれた2つのバリアントがあります-分割操作の後、2番目のバリアントは遺伝子名から孤立しています-以下を参照してください:

> 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

角括弧内の2番目(またはそれ以降)のバリアントが遺伝子名から分離されるのを防ぐための解決策をいただければ幸いです。

wp78de

分割関数に関しては、最初に次のようなパターンを使用して、角括弧の外側のセミコロンでのみ分割できます。

;(?=(?:[^\[\]]*\[[^\[\]]*\])*[^\[\]]*$)

次に、;|\[|\]分割パターンとして使用するなど、追加の手順で内部にセミコロンがある文字列を分割します。最初の結果を保持して、ネストされた値などを分割して再構築します。

正規表現のデモンストレーション

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事