我想跟踪数据帧列(“SeqCol”)中的重复序列,并记录序列何时设置回 0(或至少接近零)。每当序列重置时,我想在单独的列(“Counter”)中做笔记,但也从我的主列(“MainCol”)中获取第一个值作为最后一列(“NewCol”)
我从这样的数据框开始:
MainCol<-seq(1:20)
SeqCol<-rep(1:5,4)
SeqCol<-jitter(SeqCol)
DF<-data.frame(MainCol, SeqCol)
#Need Unique Counter whenever SeqCol starts over
DF<-DF %>% mutate(Counter = cumsum(SeqCol < lag(SeqCol, default = Inf)))
DF$NewCol<-NA
NewDF<-data.frame()
下一部分可以工作,但是当应用于大型数据帧时效率非常低且缓慢。
Uni<-unique(DF$Counter)
for(i in seq(1,length(Uni))){
MyChunk<-DF[DF$Counter==i,]
MyNewName<-MyChunk[1,"MainCol"]
MyChunk$NewCol<-MyNewName
NewDF<-rbind(NewDF,MyChunk)
}
我想复制上述 for 循环的结果,但使用更有效的方法。
大概您正在使用
dplyr::lag
,在这种情况下,dplyr 方法可能是:
DF |>
mutate(Counter = cumsum(SeqCol < lag(SeqCol, default = Inf)),
NewCol = row_number()) |>
mutate(NewCol = first(NewCol), .by = Counter)
应该快得多。我认为这是创建一个新的 MyChunk 并在每一行应用
rbind
导致你放慢速度。