Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用位置索引操作data.frame并重建所需的数据帧?_R_Dataframe - Fatal编程技术网

如何使用位置索引操作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?有人能告诉我如何

我有一个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
获取单个数据。frame
intDF
。将您的解决方案应用于我的数据时出错。也可以使用base R来实现这一点吗?谢谢:)@Arun我在将您的解决方案应用于我的数据时出错:
未找到对象“que”
,我在您的回答中使用变量
x
inputDF
。亲爱的jeremycg,我使用
bind_rows
获取单个DF
intDF
,然后继续搜索重叠,
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
...       ...         ...