R语言data.table按分组统计当前行前唯一值计数方法
R语言分组统计前序唯一值数量实现方案
你可以通过以下两种方式实现需求,两种方法都默认先按Product分组、Date排序保证行顺序符合时间先后逻辑:
data.table 实现
基础写法(易读,适配中小数据集)
library(data.table) # 先按产品、日期排序,确保行顺序和时间线一致 setorder(df, Product, Date) # 逐行计算当前行之前的唯一Owner数量 df[, BeforeOwnerCount := sapply(1:.N, \(i) uniqueN(Owner[1:(i-1)])), by = Product]
高性能写法(适配百万行级大数据集,无逐行循环)
df[, BeforeOwnerCount := { new_owner_flag <- !duplicated(Owner) cumsum(new_owner_flag) - as.integer(new_owner_flag) }, by = Product]
运行后输出结果和你给出的预期完全一致。
dplyr 实现
library(dplyr) df_result <- df %>% arrange(Product, Date) %>% group_by(Product) %>% mutate( # 基础易读版 # BeforeOwnerCount = sapply(row_number(), \(i) n_distinct(Owner[1:(i-1)])) # 高性能版 BeforeOwnerCount = cumsum(!duplicated(Owner)) - as.integer(!duplicated(Owner)) ) %>% ungroup()
实现逻辑说明
高性能写法的核心逻辑非常简洁:
- 用
!duplicated(Owner)标记每个Owner在分组内第一次出现的行 - 对标记做累计求和,得到截至当前行的累计唯一
Owner总数 - 减去当前行如果是新
Owner的计数1,就得到不含当前行的前序历史唯一Owner数量,全程向量化运算,性能远高于逐行切片的写法。
内容的提问来源于stack exchange,提问作者Samet Sökel
相关产品推荐
相关产品推荐

