基于滞后差异对数据框线进行分组

时间:2015-03-04 13:04:23

标签: r

我正在努力解决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)。

提前感谢您的帮助!

1 个答案:

答案 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