我有一個資料框,其中一列隨著每一行的增加而增加,并且會定期(盡管不定期)重置為 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"]
}
}
uj5u.com熱心網友回復:
這里不需要回圈。我們可以只使用矢量化的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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368655.html
