superponer - La condición tiene una longitud> 1 y solo se usará el primer elemento
superponer graficas en r (2)
Tengo un marco de datos, viaje:
> 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
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?
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"
}
}
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 declaración 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"