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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:12:20