我已经导出了DNA字符串中的所有起始位置和停止位置,现在我想将每个起始位置映射到每个停止位置,这两个位置都是矢量,然后使用这些位置从DNA字符串序列中提取相应的子字符串。但我无法有效地遍历两个向量来实现这一点,特别是因为它们的长度不同。
我尝试过不同版本的循环(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)
这是一个相当简单的解决方案 - 除非您确定需要额外的复杂性,否则不要过度复杂化。启动和停止似乎已经匹配,你可能只有一个比另一个更多,所以你可以找到最短矢量的长度,只使用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]) })
)
这是一个可能的tidyverse
解决方案:
library(purrr)
library(plyr)
library(dplyr)
map2
用于映射两个向量的值(开始和停止)。然后我们从这些中制作一个向量,然后进行unlist
ing并将我们的结果组合成一个data.frame
对象。
编辑:随着更新的条件,我们可以做类似的事情:
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
原版的:
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)