将分割区间坐标转换为连续区间坐标
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)
我想添加新的 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
方法可以做到这一点吗?
我们可以使用 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
请在下面找到一种可能的解决方案 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 创建
我有一个 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
方法可以做到这一点吗?
我们可以使用 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
请在下面找到一种可能的解决方案 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 创建