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

问题描述 投票:0回答:2

我有一个

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)

我想添加新的

start
end
列,它们将累积间隔宽度并显示累积的开始和结束坐标。

所以,对于上面的例子

df
,这些新的
start
end
列(
cum.start
cum.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 dataframe dplyr intervals
2个回答
2
投票

我们可以使用

lag
cumsum

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

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 包 (v2.0.1) 于 2021-12-15 创建

© www.soinside.com 2019 - 2024. All rights reserved.