当前位置:  开发笔记 > 编程语言 > 正文

折叠具有重叠范围的行

如何解决《折叠具有重叠范围的行》经验,为你挑选了2个好方法。

我有一个包含开始和结束时间的data.frame:

ranges<- data.frame(start = c(65.72000,65.72187, 65.94312,73.75625,89.61625),stop = c(79.72187,79.72375,79.94312,87.75625,104.94062))

> ranges
     start      stop
1 65.72000  79.72187
2 65.72187  79.72375
3 65.94312  79.94312
4 73.75625  87.75625
5 89.61625 104.94062

在此示例中,第2行和第3行中的范围完全在第1行的"start"和第4行的"stop"之间的范围内.因此,重叠范围1-4应折叠为一个范围:

> ranges
     start      stop
1 65.72000  87.75625
5 89.61625 104.94062

我试过这个:

mdat <- outer(ranges$start, ranges$stop, function(x,y) y > x)
mdat[upper.tri(mdat)|col(mdat)==row(mdat)] <- NA
mdat

而现在我只需要弄清楚如何结合所有真实的,但不确定它是否是最好的方法



1> Psidom..:

你可以试试这个:

library(dplyr)
ranges %>% 
       arrange(start) %>% 
       group_by(g = cumsum(cummax(lag(stop, default = first(stop))) < start)) %>% 
       summarise(start = first(start), stop = max(stop))

# A tibble: 2 × 3
#      g    start      stop
#           
#1     0 65.72000  87.75625
#2     1 89.61625 104.94062


这完全解决了我的问题,但我还不太明白.当我再次通过代码试图辨别它的魔力时,感谢你的小提琴技巧.

2> lmo..:

这是一个data.table解决方案

library(data.table)
setDT(ranges)
ranges[, .(start=min(start), stop=max(stop)),
       by=.(group=cumsum(c(1, tail(start, -1) > head(stop, -1))))]
   group    start      stop
1:     1 65.72000  87.75625
2:     2 89.61625 104.94062

这里,通过检查先前的开始是否大于停止然后使用来构建组cumsum.在每组中,计算最小开始和最大停止.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有