每次重置序列时添加一个迭代/计数的列

Add a column that iterates/ counts every time a sequence resets

我有一个数据框,其中一列随着每一行的增加而增加,并定期(尽管不是定期)重置回 1。 我想在单独的列中跟踪/计算这些重置。这个 for 循环示例完全符合我的要求,但在应用于大型数据集时速度非常慢。是否有更好/更快/更多的 R 方法来执行相同的操作:

ColA<-seq(1,20)
ColB<-rep(seq(1,5),4)

DF<-data.frame(ColA, ColB)
DF$ColC<-NA

DF[1,'ColC']<-1

#Removing line 15 and changing line 5 to 1.1 per comments in answer
DF<-DF[-15,]
DF[5,2]<-0.1

for(i in seq(1,nrow(DF)-1)){
  
  print(i)
  
  MyRow<-DF[i+1,]
  
  if(MyRow$ColB < DF[i,'ColB']){
    DF[i+1,"ColC"]<-DF[i,"ColC"] +1
  }else{
    DF[i+1,"ColC"]<-DF[i,"ColC"]
  }
}

这里不需要循环。我们可以只使用向量化的cumsum。这应该会更快:

DF$ColC<-cumsum(DF$ColB==1)

DF

要继续使用始终低于先前值的可变变量重置值,请使用 cumsum(ColB < lag(ColB)):

DF %>% mutate(ColC = cumsum(ColB < lag(ColB, default = Inf)))

   ColA ColB ColC
1     1  1.0    1
2     2  2.0    1
3     3  3.0    1
4     4  4.0    1
5     5  0.1    2
6     6  1.0    2
7     7  2.0    2
8     8  3.0    2
9     9  4.0    2
10   10  5.0    2
11   11  1.0    3
12   12  2.0    3
13   13  3.0    3
14   14  4.0    3
16   16  1.0    4
17   17  2.0    4
18   18  3.0    4
19   19  4.0    4
20   20  5.0    4