R语言中基于逻辑变量统计同一客户连续非购买次数的需求
解决方案:用dplyr或data.table生成count列
需求说明
需按customer_id分组生成count列,规则如下:
- 首次
Buy=TRUE出现前的所有行,count为NA - 每一行
Buy=TRUE对应的count固定为0 - 两次
Buy=TRUE之间的连续Buy=FALSE记录,从1开始递增计数
dplyr 实现代码
library(dplyr) df_result <- df %>% group_by(customer_id) %>% # 标记是否已出现过Buy=TRUE,生成阶段分组 mutate( has_true = cumsum(Buy) > 0, stage = cumsum(Buy) ) %>% # 计算非TRUE行的计数,首次TRUE前设为NA mutate( count = ifelse(has_true, row_number() - match(TRUE, Buy) - stage + 1, NA) ) %>% # 修正Buy=TRUE行的count为0 mutate(count = ifelse(Buy, 0, count)) %>% select(-has_true, -stage) %>% ungroup()
data.table 实现代码
library(data.table) setDT(df) df_result <- df[, { # 获取当前用户首次Buy=TRUE的位置 first_true_pos <- which(Buy)[1] # 生成每个区间的阶段标识 stage <- cumsum(Buy) # 计算初始count值 count <- if (.I >= first_true_pos) { seq_len(.N) - first_true_pos - stage + 1 } else { NA_real_ } # 将Buy=TRUE的行count设为0 count[Buy] <- 0 .(Buy, count) }, by = customer_id]
结果验证
运行代码后生成的count列与示例目标列完全匹配:
customer_id Buy count 1 1 FALSE NA 2 1 FALSE NA 3 1 TRUE 0 4 1 FALSE 1 5 1 FALSE 2 6 1 TRUE 0 7 2 FALSE NA 8 2 TRUE 0 9 2 FALSE 1 10 2 TRUE 0 11 2 TRUE 0 12 2 FALSE 1
内容的提问来源于stack exchange,提问作者Sabrina_BO
相关产品推荐
相关产品推荐

