将分割区间坐标转换为连续区间坐标

Convert split interval coordinates to continuous interval coordinates

我有一个 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方法可以做到这一点吗?

我们可以使用 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

请在下面找到一种可能的解决方案 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 创建