元のデータ (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 万行をチェックしたい)
この問題に関するヘルプは大歓迎です! そしてもちろん、この質問が以前に尋ねられた場合 (私はそれを見つけることができませんでした)、その質問へのリンクを回答として受け入れることもできます。