Начальная позиция карты в векторе, чтобы остановить позицию в другом векторе - PullRequest
2 голосов
/ 02 апреля 2019

Я вывел все начальные и конечные позиции в пределах строки ДНК, и теперь я хотел бы отобразить каждую начальную позицию с каждой конечной позицией, обе из которых являются векторами, а затем использовать эти позиции для извлечения соответствующих подстрок из строки ДНК. последовательность. Но я не могу эффективно пройти через оба вектора для достижения этой цели, тем более что они не имеют одинаковую длину.

Я пробовал разные версии циклов (for, ifelse), но пока не могу обернуться вокруг решения.

Вот пример одной из моих нескольких попыток решить эту проблему.

new = data.frame()
for (i in start_pos){
  for (j in stop_pos){
    while (j>i){
      new[j,1]=i
      new[j,2]=j
    }
     }
}

Вот пример моего желаемого результата: start = c (1,5,7, 9, 15) stop = c (4, 13, 20, 30, 40, 50). Моим желаемым результатом в идеале должен быть кадр данных из двух столбцов, отображающий каждый старт в свою конечную позицию. Я только хочу добавить строки в df, где начальные значения больше, чем его соответствующие значения останова (несколько начальных значений могут иметь одинаковые значения остановки, если это соответствует этому критерию), как показано в моем примере ниже.

 i.e first row df= (1,4)
    second row df= (5,13)
    third row df = (7, 13 )
    fourth row df = (9,13)
    fifth row df =  (15, 20)

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вот довольно простое решение - возможно, не стоит слишком усложнять ситуацию, если вы не уверены, что вам нужна дополнительная сложность.Кажется, что старты и остановки уже совпадают, у вас может быть больше одного, чем другого, поэтому вы можете найти длину самого короткого вектора и использовать только столько элементов из start и stop:

start = c(1, 5, 15) 
stop = c(4, 13, 20, 30, 40, 50)

min_length = min(length(start), length(stop))

df = data.frame(
    start = start[1:min_length],
    stop = stop[1:min_length]
)

РЕДАКТИРОВАТЬ: после прочтения некоторых ваших комментариев здесь, похоже, что ваша проблема на самом деле является более сложной, чем казалось на первый взгляд (придумали примеры, демонстрирующие необходимый уровень сложности, безбудучи слишком сложным, всегда сложно).Если вы хотите сопоставить каждый старт со следующей остановкой, которая больше, чем старт, вы можете сделать:

# Slightly modified example: multiple starts
#   that can be matched with one stop
start = c(1, 5, 8)
stop = c(4, 13, 20, 30, 40, 50)

df2 = data.frame(
    start = start,
    stop = sapply(start, function(s) { min(stop[stop > s]) })
)
1 голос
/ 02 апреля 2019

Вот возможное решение tidyverse:

library(purrr)
library(plyr)
library(dplyr)

map2 используется для отображения значений двух векторов (начало и остановка).Затем мы делаем из них один вектор, затем unlist вводим и объединяем наши результаты в data.frame объект.

EDIT : С обновленным условием мы можем сделать что-то вроде:

start1= c(118,220, 255) 
stop1 =c(115,210,260)
res<-purrr::map2(start1[1:length(stop1)],stop1,function(x,y) c(x,y[y>x]))
res[unlist(lapply(res,function(x) length(x)>1))]
   # [[1]]
   # [1] 255 260

ORIGINAL :

plyr::ldply(purrr::map2(start[1:length(stop)],stop,function(x,y) c(x,y)),unlist) %>% 
   setNames(nm=c("start","stop")) %>% 
 mutate(newCol=paste0("(",start,",",stop,")"))
#  start stop  newCol
#1     1    4   (1,4)
#2     5   13  (5,13)
#3    15   20 (15,20)
#4    NA   30 (NA,30)
#5    NA   40 (NA,40)
#6    NA   50 (NA,50)

Альтернатива: @Marius показывает хитрый способ. Ключ должен иметь соответствующую длину.

plyr::ldply(purrr::map2(start,stop[1:length(start)],function(x,y) c(x,y)),unlist) %>% 
   setNames(nm=c("start","stop")) %>% 
 mutate(newCol=paste0("(",start,",",stop,")"))
  start stop  newCol
1     1    4   (1,4)
2     5   13  (5,13)
3    15   20 (15,20)
...