The condition has length > 1 and only the first element will be used The condition has length > 1 and only the first element will be used r r

The condition has length > 1 and only the first element will be used


You get the error because if can only evaluate a logical vector of length 1.

Maybe you miss the difference between & (|) and && (||). The shorter version works element-wise and the longer version uses only the first element of each vector, e.g.:

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

You don't need the if statement at all:

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"


Like sgibb said it was an if problem, it had nothing to do with | or ||.

Here is another way to solve your problem:

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