Условие имеет длину> 1, и будет использоваться только первый элемент

У меня есть dataframe, trip:

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

Я хочу добавить третий столбец mutType, который следует этим правилам:

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

но я получаю ошибку:

 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 

Я не думаю, что мои логические утверждения должны создавать векторы, но, возможно, я что-то упускаю. trip $ mutType должен выглядеть следующим образом:

 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 

Кто-нибудь может понять, что здесь не так? Мне нужно || вместо | возможно?

    Вы получаете ошибку, потому что, if можно только оценить logical вектор длины 1.

    Возможно, вы пропустили разницу между & ( | ) и && ( || ). Более короткая версия работает по элементам, а более длинная версия использует только первый элемент каждого вектора, например:

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

    Вам вообще не нужен оператор 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" 

    Как sgibb сказал, что это проблема, это не имеет никакого отношения к | или ||.

    Вот еще один способ решить вашу проблему:

     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" } } 
    Давайте будем гением компьютера.