2014-04-26 35 views
21

Ho un dataframe, viaggio:La condizione ha lunghezza> 1 e solo il primo elemento sarà utilizzato

> 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 

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 ho 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 credo che le mie dichiarazioni logiche dovrebbero essere la produzione di vettori, ma forse io' Mi manca qualcosa. viaggio $ mutType dovrebbe finire per assomigliare a 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 ciò che è sbagliato qui? Ho bisogno || invece di | Forse?

risposta

36

si ottiene l'errore perché if può valutare un logical vettore di lunghezza 1.

Forse si dimentica la differenza tra & (|) e && (||). La versione più corta funziona elemento-saggio e la versione più lunga utilizza solo il primo elemento di ogni vettore, ad esempio:

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

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

Non è necessario il if dichiarazione a tutti:

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" 
+0

Grazie, che fa il trucco – soosus

2

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

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