如何使用位置索引操作data.frame并重建所需的数据帧?
我有一个data.frame,它由两个不同的索引向量组成,如何使用位置索引操作data.frame并重建所需的数据帧?,r,dataframe,R,Dataframe,我有一个data.frame,它由两个不同的索引向量组成,query命名为que,target命名为Sub,是同时搜索三个单独data.frame的区间数据重叠的结果,作为输入(考虑通过并行方式对齐三个区间集)。但是,inputDF是搜索重叠间隔的结果。我想用一种特殊的方式构造这个带有位置索引的data.frame,比如减少inputDF的维数,重新组合索引并重建新的data.frame,它以几何方式显示重叠索引对。有没有办法操纵inputDF并重建我想要的data.frame?有人能告诉我如何
query
命名为que
,target
命名为Sub
,是同时搜索三个单独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的构造方式:
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
intDF我们可以使用dplyr实现这一点
首先,我们按“que”分组,按“sub”排序,然后将列设置为不等于“que”的第一个和第二个sub:
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
... ... ...
对于每个que
,您是否总是有一个且只有一个与自身相等的sub
。@Psidom是的,这是关键点,基本上,我可以复制que
,并将其重命名为self\u sub
。你能告诉我实现这一目标的可能办法吗?非常感谢:)使用dcast
:dcast(x[order(que!=sub,que,sub)],que~rowid(que,prefix=“sub”)
@Arun亲爱的Arun,我添加了间隔数据并使用bind_rows
获取单个数据。frameintDF
。将您的解决方案应用于我的数据时出错。也可以使用base R来实现这一点吗?谢谢:)@Arun我在将您的解决方案应用于我的数据时出错:未找到对象“que”
,我在您的回答中使用变量x
的inputDF
。亲爱的jeremycg,我使用bind_rows
获取单个DFintDF
,然后继续搜索重叠,inputDF
作为位置索引重叠间隔的结果(数字索引指行)。根据我的更新,在BaseR中也可能发生这种情况吗?谢谢:)–请参见编辑,可以在base R中进行编辑,但在IRanges软件包中要容易得多是的,使用IRanges
软件包我将获得inputDF
,但是如何将inputDF
更改为我想要的?也可以看到基本R解决方案吗?非常感谢:)
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
... ... ...