每次重置序列时添加一个迭代/计数的列
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
我有一个数据框,其中一列随着每一行的增加而增加,并定期(尽管不是定期)重置回 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