La condizione ha lunghezza> 1 e verrà utilizzato solo il primo elemento

Ho un dataframe, viaggio:

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

Voglio aggiungere una terza colonna, mutType, che segue queste regole:

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

ma ottengo l’errore:

 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 

Non penso che le mie affermazioni logiche dovrebbero produrre vettori, ma forse mi manca qualcosa. trip $ mutType dovrebbe apparire come questo:

 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 

Qualcuno può individuare cosa c’è di sbagliato qui? Ho bisogno || invece di | Forse?

    Si ottiene l’errore perché if ansible valutare solo un vettore logical di lunghezza 1.

    Forse ti manca la differenza tra & ( | ) e && ( || ). La versione più breve funziona in base agli elementi e la versione più lunga utilizza solo il primo elemento di ciascun vettore, ad esempio:

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

    Non hai affatto bisogno dell’istruzione 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" 

    Come ha detto sgibb, era un problema se non aveva nulla a che fare con | o ||.

    Ecco un altro modo per risolvere il tuo 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" } }