R语言如何给观测值按序编号,遇到offer_start值时重置编号
实现遇
offer_start重置编号的方法 你已经提前按id、time完成排序,直接基于现有evconv表处理即可,以下是两种实现方案:
方案1:tidyverse(dplyr)实现
核心逻辑是通过偏移后的触发标记做分组累加,每组内生成连续序号:
library(dplyr) evconv <- evconv %>% mutate( # 把offer_start判断后移一位,第一行默认无前置触发,默认值为FALSE lag_offer_flag = lag(name == "offer_start", default = FALSE), # 累加生成组标识,相同标识属于同一个连续编号区间 group_id = cumsum(lag_offer_flag), # 分组内生成序号即为需要的结果 target_seq = row_number(), # 可删除不需要的临时列 lag_offer_flag = NULL, group_id = NULL )
方案2:Base R实现
不需要加载第三方包的原生实现:
# 生成偏移后的触发标记 lag_offer_flag <- c(FALSE, head(evconv$name == "offer_start", -1)) # 生成组标识 group_id <- cumsum(lag_offer_flag) # 按组生成连续序号 evconv$target_seq <- ave(rep(1, nrow(evconv)), group_id, FUN = cumsum)
逻辑说明
- 你给出的示例中,
offer_start所在行属于当前序列的最后一位,下一行才开始从1计数,因此需要把name == "offer_start"的判断结果向后偏移一位再做累加 cumsum累加逻辑值时,TRUE会被识别为1、FALSE识别为0,每次遇到偏移后的TRUE就会进入新的编号分组- 同一分组内按行顺序生成1到n的序列,即可得到你需要的编号结果
内容的提问来源于stack exchange,提问作者pablo hesk
相关产品推荐
相关产品推荐

