0

元のデータ (x) と参照 (y) の 2 つのデータセットをマージしました。場合によっては、データの特定の列に欠損値がある場合もありますが、すべての場合において、参照からこの情報を取得することができます。列 1 ~ 4 はデータ、列 5 ~ 8 は参照です。したがって、大雑把に次のような (架空の) データセットがあるとします。

入力:

EFFECT_ALLELE.x NON_EFFECT_ALLELE.x ALLELE1.x    ALLELE2.x EFFECT_ALLELE.y NON_EFFECT_ALLELE.y ALLELE1.y    ALLELE2.y
1                I                   R       ATC            A               I                   R       ATC            A
2                D                   R         A     AAAAAAAC               D                   R         A     AAAAAAAC
3                D                   R         G         GATT               D                   R         G         GATT
4             <NA>                <NA>         T        TTTCG               I                   R         T        TTTCG
5             <NA>                <NA>         T           TG               I                   R        TG            T
6                D                   R         T        TGTTA               D                   R         T        TGTTA
7                D                   R         G       GTTAGT               D                   R         G       GTTAGT

上記の例の 4 行目と 5 行目のように、最初の 2 つの列が両方とも NA である場所を検出するスクリプトが必要です。次に、ALLELE1.x == ALLELE1.y および ALLELE2.x == ALLELE2.y であるかどうかをチェックする必要がありますが、最初の 3 文字のみです。その要件が満たされる場合、EFFECT_ALLELE.x および NON_EFFECT_ALLELE.x の NA を、EFFECT_ALLELE.y および NON_EFFECT_ALLELE.y のそれぞれの同等のものに置き換える必要があります。

望ましい出力:

したがって、4 行目を次のように変更する必要があります。

EFFECT_ALLELE.x NON_EFFECT_ALLELE.x ALLELE1.x    ALLELE2.x EFFECT_ALLELE.y NON_EFFECT_ALLELE.y ALLELE1.y    ALLELE2.y
4             I                R         T        TTTCG               I                   R         T          TTTCG

5 行目は少し異なります。ここでは、ALLELE1 と ALLLELE2 が x と y の間で逆になっています。したがって、置換もにする必要があります。

  EFFECT_ALLELE.x NON_EFFECT_ALLELE.x ALLELE1.x    ALLELE2.x EFFECT_ALLELE.y NON_EFFECT_ALLELE.y ALLELE1.y    ALLELE2.y
5             R               I         T           TG               I                   R        TG            T

動作するコード (ただし遅すぎる)

これをすべての行で1つずつチェックするスクリプトを自分で作成しました。当然のことながら、これは非常に遅いです。50 行をチェックするのに約 0.12 秒かかります。つまり、ファイルにある約 100 万行をチェックするのは不可能です。ただし、機能するため、次のとおりです。

ALLELE_CHECK_LENGTH <- 3
if (TRUE %in% is.na(data$EFFECT_ALLELE.x)){ #to make sure the script won't check lines if it is not necessary
 z <- 1
 for (z in seq(along=data$EFFECT_ALLELE.x))
 {
   if(is.na(data$EFFECT_ALLELE.x[z]) & 
      is.na(data$NON_EFFECT_ALLELE.x[z]) & 
      !is.na(data$ALLELE1.x[z]) &
      !is.na(data$ALLELE2.x[z]) &
      !is.na(data$ALLELE1.y[z]) &
      !is.na(data$ALLELE2.y[z]) &
      (substr(data$ALLELE1.x[z],1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE1.y[z],1,ALLELE_CHECK_LENGTH)) &
      (substr(data$ALLELE2.x[z],1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE2.y[z],1,ALLELE_CHECK_LENGTH))){
     data$EFFECT_ALLELE.x[z] <- data$EFFECT_ALLELE.y[z]
     data$NON_EFFECT_ALLELE.x[z] <- data$NON_EFFECT_ALLELE.y[z]

     }   
 }  

 z <- 1
 for (z in seq(along=data$EFFECT_ALLELE.x))
 {
   if(is.na(data$EFFECT_ALLELE.x[z]) & 
      is.na(data$NON_EFFECT_ALLELE.x[z]) & 
      !is.na(data$ALLELE1.x[z]) &
      !is.na(data$ALLELE2.x[z]) &
      !is.na(data$ALLELE1.y[z]) &
      !is.na(data$ALLELE2.y[z]) &
      (substr(data$ALLELE1.x[z],1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE2.y[z],1,ALLELE_CHECK_LENGTH)) &
      (substr(data$ALLELE2.x[z],1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE1.y[z],1,ALLELE_CHECK_LENGTH))){
      data$EFFECT_ALLELE.x[z] <- data$NON_EFFECT_ALLELE.y[z]
      data$NON_EFFECT_ALLELE.x[z] <- data$EFFECT_ALLELE.y[z]


   }   
 }
 }

要約すれば:

  • NA を別の列の同じ行の値に置き換えます

    <NA><NA>  T  TTTCG   I   R T  TTTCG
    <NA><NA>  T  TG      I   R TG  T
    

    I R   T  TTTCG   I   R   T   TTTCG
    R I   T  TG      I   R   TG  T 
  • BUT:これを「逆」にする必要があるかどうかを確認してください
  • パフォーマンスが問題です (できるだけ短い時間で最大 100 万行をチェックしたい)

    この問題に関するヘルプは大歓迎です! そしてもちろん、この質問が以前に尋ねられた場合 (私はそれを見つけることができませんでした)、その質問へのリンクを回答として受け入れることもできます。

4

1 に答える 1