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

如何在R中按客户组筛选首次购买香蕉后的所有行(含该行)

解决方案

首先将你的示例数据转换为可直接运行的R代码:

df <- data.frame(
  customer_id = c(1,1,2,2,2,3,3),
  account_seq = c(1,2,1,3,4,1,3),
  product = c("apple", "banana", "apple", "banana", "orange", "banana", "apple")
)

方法一:使用dplyr包

这是tidyverse生态下的常用方案,代码可读性强:

library(dplyr)

filtered_df <- df %>%
  group_by(customer_id) %>%
  # 筛选每个客户首次购买香蕉及之后的所有记录
  filter(row_number() >= which(product == "banana")[1]) %>%
  ungroup()

print(filtered_df)

代码说明

  • group_by(customer_id):按客户ID分组处理
  • which(product == "banana")[1]:获取当前客户第一次购买香蕉的行号
  • row_number() >= 上述行号:保留该行及之后的所有记录
  • 如果存在从未购买香蕉的客户,该组会被自动过滤;若需保留这些客户,可修改filter条件为:
    filter(ifelse(length(which(product == "banana")) > 0, row_number() >= which(product == "banana")[1], TRUE))
    

方法二:使用data.table包

针对大数据集,data.table的处理效率更高:

library(data.table)

setDT(df)
filtered_dt <- df[, .SD[row_number() >= which(product == "banana")[1]], by = customer_id]

print(filtered_dt)

代码说明

  • setDT(df):将普通data.frame转换为data.table格式
  • .SD代表当前分组的子数据集,通过row_number()筛选符合条件的行

运行任意一种方法,都会得到你期望的输出:

#   customer_id account_seq product
# 1           1           2  banana
# 2           2           3  banana
# 3           2           4  orange
# 4           3           1  banana
# 5           3           3   apple

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:15:36