2015-06-22 36 views
0

如何获取R中区间数据的直方图状摘要?区间数据的类似于直方图的摘要

我的MWE数据有四个区间。

interval range 
Int1  2-7 
Int2  10-14 
Int3  12-18 
Int4  25-28 

我想要一个直方图类函数来计算Int1-Int4间隔如何跨越固定大小的二进制分割的范围。 该函数输出应该是这样的:

bin  count which 
[0-4] 1  Int1 
[5-9] 1  Int1 
[10-14] 2  Int2 and Int3 
[15-19] 1  Int3 
[20-24] 0  None 
[25-29] 1  Int4 

在这里,范围为[minfloor(INT1,INT2,INT3,Int40),maxceil(INT1,INT2,INT3,INT4))= [0,30)和有六个仓的大小= 5.

我将非常感谢R包或函数,实现我想要的功能的任何指针。

更新:

到目前为止,我已经从使用快速的数据结构,称为NCLIST,这比根据用户区间检索树快IRanges包的解决方案。

> library(IRanges) 
> subject <- IRanges(c(2,10,12,25), c(7,14,18,28)) 
> query <- IRanges(c(0,5,10,15,20,25), c(4,9,14,19,24,29)) 
> countOverlaps(query, subject) 
[1] 1 1 2 1 0 1 

但我仍然无法得到哪些是重叠的范围。如果通过,我会更新。

+1

你用'table'试过了吗? – akrun

+0

我试过了表,但不能超越对每个范围终点的查询的天真执行,即如果j> k且i nandu

+0

您的预期输出是基于输入示例吗?我会尝试用'休息'来削减'''' – akrun

回答

1

使用IRanges,您应该使用findOverlapsmergeByOverlaps而不是countOverlaps。它,默认情况下,不会返回但不匹配

我会把它留给你。相反,将显示使用foverlaps() 包的另一种方法:

require(data.table) 
subject <- data.table(interval = paste("int", 1:4, sep=""), 
         start = c(2,10,12,25), 
         end = c(7,14,18,28)) 
query <- data.table(start = c(0,5,10,15,20,25), 
        end = c(4,9,14,19,24,29)) 

setkey(subject, start, end) 
ans = foverlaps(query, subject, type="any") 
ans[, .(count = sum(!is.na(start)), 
     which = paste(interval, collapse=", ")), 
    by = .(i.start, i.end)] 

# i.start i.end count  which 
# 1:  0  4  1  int1 
# 2:  5  9  1  int1 
# 3:  10 14  2 int2, int3 
# 4:  15 19  1  int3 
# 5:  20 24  0   NA 
# 6:  25 29  1  int4 
+0

任何对foverlaps速度的评论比。 IRanges? foverlaps是否使用像NCList这样的特殊数据结构/算法? – nandu