La condición tiene una longitud> 1 y solo se usará el primer elemento

Tengo un dataframe, viaje:

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

Deseo agregar una tercera columna, mutType, que siga estas reglas:

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

pero obtengo el 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 

No creo que mis declaraciones lógicas deban producir vectores, pero tal vez me falta algo. trip $ mutType debería terminar luciendo así:

 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 

¿Alguien puede ver lo que está mal aquí? Necesito || en lugar de | ¿quizás?

Obtiene el error porque if solo puede evaluar un vector logical de longitud 1.

Tal vez te pierdas la diferencia entre & ( | ) y && ( || ). La versión más corta funciona a nivel de elemento y la versión más larga usa solo el primer elemento de cada vector, por ejemplo:

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

No necesita la statement if en absoluto:

 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" 

Como sgibb dijo que era un problema si no tenía nada que ver con | o ||.

Aquí hay otra forma de resolver su problema:

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