gpt4 book ai didi

r - 区间的并集和交集

转载 作者:行者123 更新时间:2023-12-04 11:04:26 24 4
gpt4 key购买 nike

我有一组不同 id 的间隔。例如:

df <- data.frame(id=c(rep("a",4),rep("b",2),rep("c",3)), start=c(100,250,400,600,150,610,275,600,700), end=c(200,300,550,650,275,640,325,675,725))

每个id的间隔不重叠,但不同id的间隔可能重叠。这是一张图片:
plot(range(df[,c(2,3)]),c(1,nrow(df)),type="n",xlab="",ylab="",yaxt="n")
for ( ii in 1:nrow(df) ) lines(c(df[ii,2],df[ii,3]),rep(nrow(df)-ii+1,2),col=as.numeric(df$id[ii]),lwd=2)
legend("bottomleft",lwd=2,col=seq_along(levels(df$id)),legend=levels(df$id))

intervals
我正在寻找的是两个功能:
1. 将这些区间合并的函数。
对于上面的示例,它将返回此 data.frame:
union.df <- data.frame(id=rep("a,b,c",4), start=c(100,400,600,700), end=c(325,550,675,725))
  • 一个将与这些间隔相交的函数,仅当所有 id 在该范围内重叠时才保留一个范围。
    对于上面的示例,它将返回此数据框:
  • intersection.df <- data.frame(id="a,b,c", start=610, end=640)

    最佳答案

    这有点尴尬,但想法是将数据展开为一系列打开和关闭事件。然后跟踪一次打开的间隔数。这假设每个组没有任何重叠的间隔。

    df <- data.frame(id=c(rep("a",4),rep("b",2),rep("c",3)), start=c(100,250,400,600,150,610,275,600,700), end=c(200,300,550,650,275,640,325,675,725))


    sets<-function(start, end, group, overlap=length(unique(group))) {
    dd<-rbind(data.frame(pos=start, event=1), data.frame(pos=end, event=-1))
    dd<-aggregate(event~pos, dd, sum)
    dd<-dd[order(dd$pos),]
    dd$open <- cumsum(dd$event)
    r<-rle(dd$open>=overlap)
    ex<-cumsum(r$lengths-1 + rep(1, length(r$lengths)))
    sx<-ex-r$lengths+1
    cbind(dd$pos[sx[r$values]],dd$pos[ex[r$values]+1])

    }

    #union
    with(df, sets(start, end, id,1))
    # [,1] [,2]
    # [1,] 100 325
    # [2,] 400 550
    # [3,] 600 675
    # [4,] 700 725

    #overlap
    with(df, sets(start, end, id,3))
    # [,1] [,2]
    # [1,] 610 640

    关于r - 区间的并集和交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30079720/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com