私は、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番目のケースのように意味がなくなったため、バリアントの位置とバリアントの変更は、それらが発生する遺伝子の名前から孤立しています。
上記の関数を変更して、新しい列名を次のように修正するにはどうすればよいですか。
以下は、この問題の複雑さを示すいくつかのサンプルデータです。
# 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番目(またはそれ以降)のバリアントが遺伝子名から分離されるのを防ぐための解決策をいただければ幸いです。
分割関数に関しては、最初に次のようなパターンを使用して、角括弧の外側のセミコロンでのみ分割できます。
;(?=(?:[^\[\]]*\[[^\[\]]*\])*[^\[\]]*$)
次に、;|\[|\]
分割パターンとして使用するなど、追加の手順で内部にセミコロンがある文字列を分割します。最初の結果を保持して、ネストされた値などを分割して再構築します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加