R: Рассчитать относительное расстояние - PullRequest
2 голосов
/ 20 мая 2011

У меня есть датафрейм, похожий на переменную 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,]))} 
 }

Но это пока не работает.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Я склонен согласиться с @ Andrie, но если вы действительно хотите «однострочное решение» (ну вроде):

zz <- transform(dat, distance_startsite = abs(ifelse(strand.x=="+", start.x, stop.x)-ifelse(strand.y=="+", start.y, stop.y)))
1 голос
/ 20 мая 2011

Если вы сделаете это шаг за шагом и будете использовать некоторые временные переменные, вы избавите себя от многих проблем, и ваш код станет намного понятнее.

Вот что я предлагаю:

  1. Добавить столбец с начальными и конечными значениями (используя ваши условия)
  2. Рассчитать абсолютную разницу

Два дальнейших наблюдения:

  • Ваши начальные и конечные значения являются целочисленными значениями, поэтому вам не нужно постоянно использовать as.numeric
  • В исходном вопросе у вас есть противоречивые условия для стартового сайта, но нет условий для остановочного сайта, поэтому я решил, что вы действительно имели в виду.

код:

dat$start <- with(dat, ifelse(strand.x=="+", start.x, stop.x))
dat$stop  <- with(dat, ifelse(strand.y=="+", start.y, stop.y))
dat$dist  <- with(dat, abs(stop-start))

Результаты:

dat

    start.x    stop.x strand.x   start.y    stop.y strand.y      dist
1  16954189  16963562        -  16954189  16963562        -         0
2  16954189  16963562        - 150045170 150065177        - 133101615
3 150045170 150065177        -  16954189  16963562        - 133101615
4 150045170 150065177        - 150045170 150065177        -         0
5  97061519  97190927        -  97061519  97190927        -         0
6  97061519  97190927        - 135190856 135202610        +  37999929
7 135190856 135202610        +  97061519  97190927        -  37999929
8 135190856 135202610        + 135190856 135202610        +         0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...