我的data.frame由两个不同的索引向量组成,query
名为que
,target
名为subj
,是搜索区间重叠的结果三个单独data.frame的数据同时作为输入(考虑对齐并行设置的三个间隔)。但是,inputDF
是搜索重叠间隔的结果。我想以一种特殊的方式构造带有位置索引的data.frame,例如减少inputDF
的维度,重新组合索引并重建新的data.frame,它几何上显示重叠索引的对。有没有办法操纵inputDF
并重建我想要的data.frame?谁能指出我如何轻松实现这一目标?有没有有效的方法来使用inputDF
并构建所需的data.frame?有什么想法吗?
以下是间隔对齐的可视化:
以下是结果示例data.frame:
inputDF <- data.frame(
que=c(5 , 7 , 8 , 9 ,14 ,16, 17 ,20 ,21, 22 , 8 , 9 ,16 ,22 , 2 ,12 ,15 ,18,
21 , 4 , 3 , 7 ,15 ,21 ,13 ,19 , 4 , 5 , 6, 13, 14, 19 ,20, 2 , 3 ,12,
18 , 6 , 5 ,11, 14, 20 ,8 ,16 ,22 , 9 ,17 , 1, 10 , 1 , 2 , 3, 11,12,
18 , 1 ,10),
subj=c( 5 , 7 , 8, 17 , 5 ,8 ,17 , 5 ,7 ,8, 22 ,22, 22, 22 , 2 ,2 ,15, 2,
15 ,4 ,3 ,21 ,21 ,21 ,13 ,13 ,20 ,20 ,20 ,19 ,20 ,19 ,20 ,12 ,12 ,12,
12 ,6 ,14 ,11 ,14 ,14 ,16 ,16 ,16 ,9 ,9 ,1 ,1 ,18 ,18 ,18 ,18 ,18, 18 ,10 ,10)
)
为了构建所需的data.frame,我使用NA
替换subj_2
中的非重叠间隔;
这是我想要的data.frame
:
desiredDF <- data.frame(
que=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22),
self.subj=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22),
subj_1=c(10,12,12,20,14,20,21,16,17,1,18,12,19,5,21,8,9,12,13,5,7,8),
subj_2=c(18,18,18,NA,20,NA,NA,22,22,NA,NA,18,NA,20,NA,22,NA,18,NA,14,15,16)
)
修改:
例如,这些是区间数据以及我想要的data.frame如何构建:
intDF <- list(
bar=data.frame(start=c(8,18,33,53,69,81,105,115,135),
stop=c(14,21,39,61,73,87,111,120,153)),
cat=data.frame(start=c(6,15,20,44,71,99,113,141),
stop=c(10,17,34,51,78,103,124,147)),
foo=data.frame(start=c(11,43,57,101,117),
stop=c(36,49,92,109,139))
)
intDF <- bind_rows(intDF) # now it is easier to understand position index, such as `10`,`11` refers to 10th, 11th row in `intDF` and so on.
que self.sub subj1 subj2
1 1 10 18
2 2 12 18
3 3 12 18
4 4 20
5 5 14 20
6 6 20
7 7 21
8 8 16 22
如何实现我想要的data.frame?是否有任何有效的方法来操纵inputDF
来构建所需的data.frame?
答案 0 :(得分:2)
我们可以使用dplyr来做到这一点。
首先我们将你的'que'分组,按'subj'排序,然后将列设置为第一个和第二个不等于'que'的subj:
library(dplyr)
inputDF %>%
group_by(que) %>%
arrange(subj) %>%
summarise(self.sub = que[1], subj1 = subj[subj!=que][1], subj2 = subj[subj!=que][2])
Source: local data frame [22 x 4]
que self.sub subj1 subj2
(dbl) (dbl) (dbl) (dbl)
1 1 1 10 18
2 2 2 12 18
3 3 3 12 18
4 4 4 20 NA
5 5 5 14 20
6 6 6 20 NA
7 7 7 21 NA
8 8 8 16 22
9 9 9 17 22
10 10 10 1 NA
.. ... ... ... ...
为了响应您的修改,我们可以使用IRanges
包:
library(IRanges)
myranges = IRanges(start = intDF$start, end = intDF$stop)
data = as.data.frame(findOverlaps(myranges))
data
queryHits subjectHits
1 1 10
2 1 1
3 1 18
4 2 18
5 2 2
6 2 12
7 3 18
8 3 12
9 3 3
10 4 4
... ... ...