r - 将向量中的开始位置映射到另一个向量中的停止位置
问题描述
我已经导出了 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 上添加行,其中 by 起始值大于其相应的停止值(只要满足此条件,多个起始值可以具有相同的停止值),如下面的示例所示。
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)
解决方案
这是一个可能的tidyverse
解决方案:
library(purrr)
library(plyr)
library(dplyr)
map2
用于映射两个向量(开始和停止)的值。然后我们从这些向量中创建一个向量,然后unlist
将我们的结果组合成一个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)
推荐阅读
- go - 如何计算文件中的单词
- javascript - 无法从 API 正确获取数据
- angular - 当我使用括号表示法传递类型时,为什么复选框在 Angular 中不能按预期工作?
- list - 如何在 AppleScript 中的两个列表之间找到相等的值?
- c++ - 如何替换向量中的序列
- font-awesome - 为什么我有水瓶而不是字体真棒图标?
- javascript - 如何在 JavaScript 中正确使用 Promise.then()?
- c# - 如何从数据列表更新数据库表?
- python - 使用 Python 比较两个不同的 csv 列时无法获取缺失的元素
- android - 无法从资产中复制预先创建的数据库