You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:04:59