I have a dataframe, trip:
> 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
I want to add a third column, mutType, that follows these rules:
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" } }
but I get the error:
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
I don't think my logical statements should be producing vectors, but maybe I'm missing something. trip$mutType should end up looking like this:
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
Can anyone spot what's wrong here? Do I need || instead of | perhaps?
How to Fix in R: the condition has length > 1 and only the first element will be used. This error occurs when you attempt to use an if() function to check for some condition, but pass a vector to the if() function instead of individual elements. This tutorial shares exactly how to fix this error.
We can fix this error by using an ifelse() function. ifelse() function allows us to deal with each value at one time.
This warning message occurs when you pass a function a multi-value argument (such as a vector or an array) and the function expects to evaluate a single value. R will print this warning message result if you attempt to pass a multi-element vector to a function which can operate on only one logical element.
Let's call the function and pass the numeric vector as an argument: f(vec) Error in if (x > 0) { : the condition has length > 1. The error occurs because the vector has a length greater than one. The if() function can only check one element at a time.
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With