根据列中的序列中断对数据帧进行分组?

时间:2019-03-27 11:18:33

标签: r dplyr

我有一个data.frame,它有一列整数值。我需要形成一个分组变量,以标识该列中的序列中断。例如,我可以创建另一列升序整数,每当原始列的值不大于其滞后值时就添加一个。我该怎么做?

例如如果我有一个像这样的data.frame:

df <- data.frame(A = c(1,2,4,6,78,3,56,78,23))

我需要某种方式来产生带有B列的新表:

df$B <- c(1,1,1,1,1,2,2,2,3)

我尝试过与dplyr

df %>% mutate(B = 1,
              B = case_when(A < lag(A), B + 1))

那不是很正确。

2 个答案:

答案 0 :(得分:5)

我们可以使用cumsumdiff,它们会在每次破坏序列时增加值

cumsum(c(-1, diff(df$A)) < 0)
#[1] 1 1 1 1 1 2 2 2 3

我们还可以集成到dplyr链中以获得

library(dplyr)

df %>%
  mutate(B = cumsum(c(-1, diff(A)) < 0))

#   A B
#1  1 1
#2  2 1
#3  4 1
#4  6 1
#5 78 1
#6  3 2
#7 56 2
#8 78 2
#9 23 3

使用lag的骇客方式可能是

df %>%
  mutate(B = cumsum(c(-1, (A - lag(A))[-1]) < 0))

答案 1 :(得分:1)

或使用data.table

library(data.table)
setDT(df)[, B := cumsum(A - shift(A, fill = first(A)) < 0) + 1][]
#    A B
#1:  1 1
#2:  2 1
#3:  4 1
#4:  6 1
#5: 78 1
#6:  3 2
#7: 56 2
#8: 78 2
#9: 23 3