我的数据框看起来像这样:
nr grp start stop l1 ratio 11 1 300 350 + 1.0 12 1 400 450 - 0.8 13 1 50 550 + 1.0 ……
我们可以使用顺序为每个变化创建组 diff 如果组中有多于1行并更新值,则从每个组中仅选择第一行 stop 在组中持续值。
diff
stop
library(dplyr)df %>% group_by(group = cumsum(c(1, diff(nr) != 1))) %>% mutate(stop = last(stop)) %>% filter(n() > 1 & row_number() == 1) %>% ungroup() %>% select(-group)nr grp start stop l1 ratio 1 11 1 300 650 + 12 36 1 1000 1400 + 0</code>
library(dplyr)
df %>% group_by(group = cumsum(c(1, diff(nr) != 1))) %>% mutate(stop = last(stop)) %>% filter(n() > 1 & row_number() == 1) %>% ungroup() %>% select(-group)
nr grp start stop l1 ratio 1 11 1 300 650 + 12 36 1 1000 1400 + 0</code>
</code>
使用data.table很容易:
DT <- fread(“ nr grp start stop l1 ratio 11 1 300 350 + 1.0 12 1 400 450 - 0.8 13 1 50 550 + 1.0 14 1 600 650 - 1.0 21 1 800 850 - 1.0 36 1 1000 1050 + 0.0 37 1 1100 1200 + 0.9 38 1 1250 1300 - 0.7 39 1 1350 1400 + 1.0”)setDT(DT) #if you haven’t imported with freadcreate group ID, here for didactic reasonDT[, groups := cumsum(c(TRUE, diff(nr) != 1))]take first row and replace stop from last rowDT[, if (.N > 1) { res <- .SD[1] res$stop <- .SD[.N, stop] res } else NULL, by = groups]groups nr grp start stop l1 ratio1: 1 11 1 300 650 + 12: 3 36 1 1000 1400 + 0</code>
DT <- fread(“ nr grp start stop l1 ratio 11 1 300 350 + 1.0 12 1 400 450 - 0.8 13 1 50 550 + 1.0 14 1 600 650 - 1.0 21 1 800 850 - 1.0 36 1 1000 1050 + 0.0 37 1 1100 1200 + 0.9 38 1 1250 1300 - 0.7 39 1 1350 1400 + 1.0”)
setDT(DT) #if you haven’t imported with fread
create group ID, here for didactic reasonDT[, groups := cumsum(c(TRUE, diff(nr) != 1))]
DT[, groups := cumsum(c(TRUE, diff(nr) != 1))]
take first row and replace stop from last rowDT[, if (.N > 1) { res <- .SD[1] res$stop <- .SD[.N, stop] res } else NULL, by = groups]
DT[, if (.N > 1) { res <- .SD[1] res$stop <- .SD[.N, stop] res } else NULL, by = groups]
groups nr grp start stop l1 ratio1: 1 11 1 300 650 + 12: 3 36 1 1000 1400 + 0</code>