我合并了两个数据集,一个原始数据 (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 行)
非常感谢您对这个问题的任何帮助!当然,如果之前有人问过这个问题(我找不到),我也会接受指向该问题的链接作为答案。