0

我合并了两个数据集,一个原始数据 (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 行)

    非常感谢您对这个问题的任何帮助!当然,如果之前有人问过这个问题(我找不到),我也会接受指向该问题的链接作为答案。

4

1 回答 1

1

试试这个:

w<-which(is.na(data$EFFECT_ALLELE.x) & 
 is.na(data$NON_EFFECT_ALLELE.x) & 
 !is.na(data$ALLELE1.x) &
 !is.na(data$ALLELE2.x) &
 !is.na(data$ALLELE1.y) &
 !is.na(data$ALLELE2.y) &
 (substr(data$ALLELE1.x,1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE2.y,1,ALLELE_CHECK_LENGTH)) &
 (substr(data$ALLELE2.x,1,ALLELE_CHECK_LENGTH) == substr(data$ALLELE1.y,1,ALLELE_CHECK_LENGTH)))
data$EFFECT_ALLELE.x[w] <- data$NON_EFFECT_ALLELE.y[w]
data$NON_EFFECT_ALLELE.x[w] <- data$EFFECT_ALLELE.y[w]
于 2013-11-07T13:31:18.293 回答