我正在努力解决R编程问题。 我正在研究一个数据框,例如:
START STOP
1 535 545
2 545 555
3 555 565
4 565 575
5 575 585
6 585 595
7 595 605
8 605 615
9 615 625
10 625 635
11 2635 2645
12 2645 2655
我想将随时间推移的线条分组(即第1行和第3行,因为545 - 545 = 0,或者小,> = - 20)。
我计算如下:
x <- df$STOP[1:(nrow(df)-1)] - df$START[2:nrow(df)]
最终用这段代码填补小空白:
x <- ifelse(x >= -20, 0, x)
现在我想根据第i + 1行的START值和第i行的结束值进行比较来构建一个GROUP列。
如果第i和第i + 1行被视为关注者,我将它们放入同一组。对于第1行到第10行,GROUP将等于'1',对于第11行和第12行,GROUP等于'2'。
然后我想提取每组的第一个开始和最后一站(即组1开始= 535 /结束= 635;组2开始= 2635 /结束= 2655)。
提前感谢您的帮助!
答案 0 :(得分:2)
您可以将cumsum(x < -20)
用于分组变量。以下是使用dplyr
的实现。我还使用lag
函数来计算x
(我称之为diff
)。
require(dplyr)
df %>% mutate(diff = lag(STOP, default=-Inf) - START,
grp = cumsum(diff < -20))
您还可以轻松获得分组摘要:
df %>% mutate(diff = lag(STOP, default=-Inf) - START,
grp = cumsum(diff < -20)) %>%
group_by(grp) %>%
summarize(min(START), max(STOP)) %>%
as.data.frame