У меня есть датафрейм, похожий на переменную x.
x<-"start.x stop.x strand.x start.y stop.y strand.y
1 16954189 16963562 - 16954189 16963562 -
2 16954189 16963562 - 150045170 150065177 -
3 150045170 150065177 - 16954189 16963562 -
4 150045170 150065177 - 150045170 150065177 -
5 97061519 97190927 - 97061519 97190927 -
6 97061519 97190927 - 135190856 135202610 +
7 135190856 135202610 + 97061519 97190927 -
8 135190856 135202610 + 135190856 135202610 +"
dat <- read.table(textConnection(x), header=TRUE)
Обычно я вычисляю для каждой строки относительное расстояние между start.x и start.y с помощью следующего кода:
zz <- transform(x,
distance_startsite = abs(as.numeric(start.x) - as.numeric(start.y)))
Но прежде чем рассчитать это время, нам сначала нужнопосмотрите на strand.x и strand.y.
- Если strand.x равен "-", официальным стартовым сайтом является stop.x
- Если strand.x равен "+", официальным стартовым сайтом является start.x
- Если strand.y равен "-", официальным стартовым сайтом является stop.y
- Если strand.y равен "+", официальным стартовым сайтом является start.y
Строка 1 в таблице dat должна вычислять это: abs (as.numeric (stop.x) - as.numeric (stop.y) вместо abs (as.numeric (start.x) - as.numeric (start).y).
У меня вопрос, есть ли способ рассчитать это для каждой строки, например, zz?
Спасибо
РЕДАКТИРОВАТЬ: моя первая мысль была примерно такой:
for (i in 1:nrow(dd)){
if (dat$strand.x[i,] == "-" & dat$stand.y[i,] == "-") {
result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(stop.x[i,]) - as.numeric(stop.y[i,]))} else
if (dat$strand.x[i,] == "+" & dat$stand.y[i,] == "-") {
result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(start.x[i,]) - as.numeric(stop.y[i,]))} else
if (dat$strand.x[i,] == "-" & dat$stand.y[i,] == "+") {
result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(stop.x[i,]) - as.numeric(start.y[i,]))} else
if (dat$strand.x[i,] == "+" & dat$stand.y[i,] == "+") {
result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(start.x[i,]) - as.numeric(start.y[i,]))}
}
Но это пока не работает.