【问题标题】:The condition has length > 1 and only the first element will be used条件的长度 > 1 并且仅使用第一个元素
【发布时间】:2014-04-26 20:29:21
【问题描述】:

我有一个数据框,行程:

> head(trip.mutations)
  Ref.y Variant.y
1 T     C 
2 G     C 
3 A     C  
4 T     C 
5 C     A 
6 G     A 

我想添加第三列,mutType,它遵循以下规则:

for (i in 1:nrow(trip)) {
   if(trip$Ref.y=='G' & trip$Variant.y=='T'|trip$Ref.y=='C' & trip$Variant.y=='A') {
      trip[i, 'mutType'] <- "G:C to T:A"
   }
   else if(trip$Ref.y=='G' & trip$Variant.y=='C'|trip$Ref.y=='C' & trip$Variant.y=='G') {
      trip[i, 'mutType'] <- "G:C to C:G"
   }
   else if(trip$Ref.y=='G' & trip$Variant.y=='A'|trip$Ref.y=='C' & trip$Variant.y=='T') {
      trip[i, 'mutType'] <- "G:C to A:T"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='T'|trip$Ref.y=='T' & trip$Variant.y=='A') {
      trip[i, 'mutType'] <- "A:T to T:A"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='G'|trip$Ref.y=='T' & trip$Variant.y=='C') {
      trip[i, 'mutType'] <- "A:T to G:C"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='C'|trip$Ref.y=='T' & trip$Variant.y=='G') {
      trip[i, 'mutType'] <- "A:T to C:G"
   }
}

但我得到了错误:

Warning messages:
1: In if (trip$Ref.y == "G" & trip$Variant.y == "T" | trip$Ref.y ==  ... :
  the condition has length > 1 and only the first element will be used

我认为我的逻辑语句不应该产生向量,但也许我遗漏了一些东西。 trip$mutType 应该最终看起来像这样:

mutType
A:T to G:C
G:C to C:G
A:T to C:G
A:T to G:C
G:C to T:A
G:C to A:T

谁能发现这里有什么问题?我需要||而不是 |也许?

【问题讨论】:

    标签: r if-statement conditional calculated-columns


    【解决方案1】:

    您收到错误是因为 if 只能评估长度为 1 的 logical 向量。

    也许你错过了&amp; (|) 和&amp;&amp; (||) 之间的区别。较短的版本按元素工作,较长的版本仅使用每个向量的第一个元素,例如:

    c(TRUE, TRUE) & c(TRUE, FALSE)
    # [1] TRUE FALSE
    
    # c(TRUE, TRUE) && c(TRUE, FALSE)
    [1] TRUE
    

    您根本不需要if 语句:

    mut1 <- trip$Ref.y=='G' & trip$Variant.y=='T'|trip$Ref.y=='C' & trip$Variant.y=='A'
    trip[mut1, "mutType"] <- "G:C to T:A"
    

    【讨论】:

      【解决方案2】:

      就像 sgibb 说的那样,这是一个 if 问题,它与 | 无关或 ||。

      这是解决问题的另一种方法:

      for (i in 1:nrow(trip)) {
        if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='A') {
          trip[i, 'mutType'] <- "G:C to T:A"
        }
        else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='G') {
          trip[i, 'mutType'] <- "G:C to C:G"
        }
        else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='A'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='T') {
          trip[i, 'mutType'] <- "G:C to A:T"
        }
        else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='A') {
          trip[i, 'mutType'] <- "A:T to T:A"
        }
        else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='G'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='C') {
          trip[i, 'mutType'] <- "A:T to G:C"
        }
        else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='G') {
          trip[i, 'mutType'] <- "A:T to C:G"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多