【问题标题】:Convert split interval coordinates to continuous interval coordinates将分割区间坐标转换为连续区间坐标
【发布时间】:2022-01-19 00:46:53
【问题描述】:

我有一个data.frame,其中每个id 映射到几个不连续的线性区间,它们不重叠,并且按升序排序:

df <- data.frame(id = c(rep("id1",3),rep("id2",4)),
                 start = c(101,220,307,550,658,742,855),
                 end = c(154,246,326,625,712,811,944),
                 stringsAsFactors = F)

我想添加新的 startend 列,这些列将累积累加间隔宽度并显示累积的开始和结束坐标。

因此,对于上面的示例 df,这些新的 startend 列(cum.startcum.end)将是:

df$cum.start <- c(1,55,82,1,77,132,202)
df$cum.end <- c(54,81,101,76,131,201,291)

有任何dplyr 的方法吗?

【问题讨论】:

    标签: r dplyr intervals


    【解决方案1】:

    我们可以使用lagcumsum

    library(dplyr)
    
    df1 %>% 
      group_by(id) %>% 
      mutate(cum.start = c(1, lag(cumsum(end - start + 1))[-1] + 1) ,
             cum.end = cumsum(end - start + 1))
    
    #> # A tibble: 7 x 5
    #> # Groups:   id [2]
    #>   id    start   end cum.start cum.end
    #>   <chr> <dbl> <dbl>     <dbl>   <dbl>
    #> 1 id1     101   154         1      54
    #> 2 id1     220   246        55      81
    #> 3 id1     307   326        82     101
    #> 4 id2     550   625         1      76
    #> 5 id2     658   712        77     131
    #> 6 id2     742   811       132     201
    #> 7 id2     855   944       202     291
    

    【讨论】:

    • 我想每个人都有类似的想法,所以我不会发布另一个答案。变体 - df %&gt;% group_by(id) %&gt;% mutate(newend = cumsum(end - start + 1), newstart = lag(newend + 1, default=1))
    • @thelatemail 一开始我实际上是这样做的,但不想重新排列列(尽管这样可能更有效)。
    【解决方案2】:

    请使用dplyr在下面找到一种可能的解决方案

    • 代码
    df %>% 
      group_by(id) %>% 
      mutate( diff = end-start+1,
                   cum.end = cumsum(diff),
                   cum.start = cum.end - diff + 1) %>% 
      select(-diff) %>% 
      relocate("cum.end", .after = last_col())
    
    • 输出
    #> # A tibble: 7 x 5
    #> # Groups:   id [2]
    #>   id    start   end cum.start cum.end
    #>   <chr> <dbl> <dbl>     <dbl>   <dbl>
    #> 1 id1     101   154         1      54
    #> 2 id1     220   246        55      81
    #> 3 id1     307   326        82     101
    #> 4 id2     550   625         1      76
    #> 5 id2     658   712        77     131
    #> 6 id2     742   811       132     201
    #> 7 id2     855   944       202     291
    

    reprex package (v2.0.1) 于 2021 年 12 月 15 日创建

    【讨论】:

    • 你需要group_by(id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2020-05-14
    相关资源
    最近更新 更多