我有一个线性间隔的data.frame
,其中每个间隔也有一个数字索引:
df <- data.frame(id = c("id1","id20","id7","id12","id15"),
start = c(36, 41, 216, 234, 300),
end = c(21, 112, 263, 269, 340),
index = c(11, 12, 28, 29, 33))
其中df
按index
升序排序。
我想将索引连续的每组行合并为一行,以便它们的 id
由 ;
, start
是集合的最小 start
,end
是集合的最大 end
,index
是也是集合的最大索引
。
因此,对于上面的示例,合并后的 data.frame
将是:
merged.df <- data.frame(id = c("id1;id20","id7;id12","id15"),
start = c(36, 216, 300),
end = c(112, 269, 340),
index = c(12, 29, 33))
有什么想法吗?
最佳答案
您可以使用cumsum(c(TRUE, diff(index) != 1))
以确定索引的连续位置。
library(dplyr)
df %>%
group_by(grp = cumsum(c(TRUE, diff(index) != 1))) %>%
summarise(id = paste(id, collapse = ";"),
start = min(start), end = max(end),
index = last(index)) %>%
select(-grp)
# # A tibble: 3 × 4
# id start end index
# <chr> <dbl> <dbl> <dbl>
# 1 id1;id20 36 112 12
# 2 id7;id12 216 269 29
# 3 id15 300 340 33
关于r - 按连续索引合并 data.frame 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72823674/