如何根据重复序列使用单独列中的第一个值更新列中的行值

问题描述 投票:0回答:1

我想跟踪数据帧列(“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 循环的结果,但使用更有效的方法。

r
1个回答
0
投票

大概您正在使用

dplyr::lag
,在这种情况下,dplyr 方法可能是:

DF |>
  mutate(Counter = cumsum(SeqCol < lag(SeqCol, default = Inf)),
         NewCol = row_number()) |>
  mutate(NewCol = first(NewCol), .by = Counter)

应该快得多。我认为这是创建一个新的 MyChunk 并在每一行应用

rbind
导致你放慢速度。

© www.soinside.com 2019 - 2024. All rights reserved.