我有包含开始值和结束值的数据文件以及另一列包含 0 和 1 的数据。
0:一行的结束值与下一行的起始值不重合 1:如果一行的结束值与下一行的起始值一致
chr | 开始 | 结束 | 价值 |
---|---|---|---|
1 | 1000 | 5000 | 0 |
1 | 5500 | 5800 | 1 |
1 | 5700 | 6300 | 1 |
1 | 6500 | 7000 | 0 |
1 | 7200 | 8000 | 0 |
1 | 7500 | 9000 | 1 |
1 |
我想根据开始和结束的重合方式合并行。
chr | 开始 | 结束 | 价值 |
---|---|---|---|
1 | 1000 | 5000 | 0 |
1 | 5500 | 6300 | 1 |
1 | 6500 | 7000 | 0 |
1 | 7200 | 9000 | 0 |
我正在努力找出合并这些列的策略。如有任何帮助,我们将不胜感激。
我不确定我完全理解规则是什么,但这给出了与问题中显示的预期数据框相同的结果。 (输入在最后的注释中可重复定义。)
library(dplyr)
DF2 <- DF %>%
mutate(run = cumsum(lead(value, default = 0) == 1 | value == 0)) %>%
summarize(start = min(start), end = max(end), value = first(value),
.by = c(chr, run)) %>%
select(-run)
identical(DF2, target)
## [1] TRUE
DF <- data.frame(
chr = rep(1L, 6L),
start = c(1000L, 5500L, 5700L, 6500L, 7200L, 7500L),
end = c(5000L, 5800L, 6300L, 7000L, 8000L, 9000L),
value = c(0L, 1L, 1L, 0L, 0L, 1L)
)
target <- data.frame(
chr = rep(1L, 4L),
start = c(1000L, 5500L, 6500L, 7200L),
end = c(5000L, 6300L, 7000L, 9000L),
value = c(0L, 1L, 0L, 0L)
)