предупреждение с оператором if else в R

Мои данные выглядят примерно так

start end strand
45    52    +
66    99    -

Назовем эту таблицу1.

Если у меня есть + в цепочке, я должен вернуть два значения, которые составляют +/- 10 от начального значения.

Итак, здесь я должен вернуть 55 и 35.

Если у меня есть строка -in, я должен вернуть два значения, которые составляют +/- 10 от конечного значения.

Для этого я написал эту программу:

if(table1$strand == '+'){
newstart = table1$start - 10
newend = table1$start + 10
} else {
newstart = table1$end - 10
newend = table1$end + 10
}

Но я получаю это предупреждающее сообщение:

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

Есть ли способ избежать этого с помощью векторизованных методов?


person user3683555    schedule 12.08.2014    source источник
comment
table1$strand == '+' повторно настраивает логический вектор, и только его первое значение используется для оценки оператора if. Объясните, пожалуйста, чего вы ожидаете в результате на приведенном выше примере?   -  person DrDom    schedule 12.08.2014
comment
да, есть ли способ избавиться от этого предупреждающего сообщения   -  person user3683555    schedule 12.08.2014
comment
@user3683555 user3683555 Спросите, есть ли способ избавиться от предупреждающего сообщения? это все равно, что спросить, есть ли способ выключить индикатор проверки двигателя?   -  person Señor O    schedule 12.08.2014


Ответы (2)


Вы хотите использовать ifelse для векторизации процесса:

ifelse(table1$strand == '+', table1$start, table1$end) 

Это делает все за один шаг:

> outer(ifelse(table1$strand == '+', table1$start, table1$end), c(10, -10), `+`)
     [,1] [,2]
[1,]   55   35
[2,]  109   89
person Señor O    schedule 12.08.2014

Вот пример использования ifelse. Если это ваши образцы данных

table1<-structure(list(start = c(45L, 66L), end = c(52L, 99L), strand = structure(c(2L, 
1L), .Label = c("-", "+"), class = "factor")), .Names = c("start", 
"end", "strand"), class = "data.frame", row.names = c(NA, -2L))

тогда вы могли бы сделать

newstart <- ifelse(table1$strand=="+", table1$start, table1$end)-10
newend <- newstart + 20

для работы со всеми строками одновременно.

person MrFlick    schedule 12.08.2014