我合并了两个数据集,一个原始数据 (x) 和一个参考 (y)。在某些情况下,数据在特定列中有一些缺失值,但在所有情况下,都可以从参考中检索此信息。第 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
我需要一个脚本来检测前两列都是 NA 的位置,例如上面示例中的第 4 行和第 5 行。然后它应该检查是否 ALLELE1.x == ALLELE1.y 和 ALLELE2.x == ALLELE2.y,但只检查前三个字符。如果满足该要求,则应将 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
工作代码(但太慢)
我自己编写了一个脚本,逐行检查每一行。毫不奇怪,这非常慢。检查 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
- 但是:检查这是否应该“反转”
性能是一个问题(希望在尽可能短的时间内检查~1M 行)
非常感谢您对这个问题的任何帮助!当然,如果之前有人问过这个问题(我找不到),我也会接受指向该问题的链接作为答案。