如何在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
相关产品推荐
相关产品推荐

