条件长度> 1,只有第一个元素将被使用

我有一个dataframe,旅程:

> head(trip.mutations) Ref.y Variant.y 1 TC 2 GC 3 AC 4 TC 5 CA 6 GA 

我想添加第三列,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 

我不认为我的逻辑陈述应该是制作载体,但也许我错过了一些东西。 旅行$ 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 

任何人都可以发现这里有什么问题? 我需要||吗? 而不是| 也许?

你得到的错误,因为if只能评估一个长度为1的logical向量。

也许你错过了&| )和&&|| )之间的区别。 较短的版本以元素方式工作,较长的版本仅使用每个vector的第一个元素,例如:

 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" 

就像sgibb说的那样,这是一个问题,跟这个没有任何关系 或||。

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

 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" } }