如何使用位置索引操作data.frame并重建所需的?

时间:2017-01-19 21:18:40

标签: r dataframe

我的data.frame由两个不同的索引向量组成,query名为quetarget名为subj,是搜索区间重叠的结果三个单独data.frame的数据同时作为输入(考虑对齐并行设置的三个间隔)。但是,inputDF是搜索重叠间隔的结果。我想以一种特殊的方式构造带有位置索引的data.frame,例如减少inputDF的维度,重新组合索引并重建新的data.frame,它几何上显示重叠索引的对。有没有办法操纵inputDF并重建我想要的data.frame?谁能指出我如何轻松实现这一目标?有没有有效的方法来使用inputDF并构建所需的data.frame?有什么想法吗?

以下是间隔对齐的可视化:

enter image description here

以下是结果示例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?

1 个答案:

答案 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
...       ...         ...