Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 424
soosus Avatar asked Apr 26 '14 20:04

soosus


People also ask

Has length 1 and only the first element will be used?

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.

How do you fix the condition has length 1 and only the first element will be used?

We can fix this error by using an ifelse() function. ifelse() function allows us to deal with each value at one time.

What does the condition has length 1 and only the first element will be used mean in R?

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.

What does the condition has length 1 mean in R?

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.


1 Answers

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 image 106
sgibb Avatar answered Sep 17 '22 17:09

sgibb