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

如何按日期计算每个用户首次与末次得分的差值

按用户计算首次与末次得分差值的实现方案

需求说明

按用户ID分组,基于日期顺序计算每个用户的首次得分与末次得分的差值,并将该差值添加到原数据集的每一行中,要求方法高效适配大规模数据集。

原始数据

ID <- c(1,1,1,2,2,3,3,3,3,4)
Score <- c(3,2,1,1,2,0,0,3,4,0)
Date <- c("2020/01/01","2020/01/02","2020/01/03","2020/02/05","2020/02/06","2021/10/01","2021/10/02","2021/10/03","2021/10/04","2022/03/01")

a <- data.frame(ID,Score,Date)

期望结果

diff_first_last <- c(-2,-2,-2,1,1,4,4,4,4,0)
b <- data.frame(ID,Score,Date,diff_first_last)

高效实现方法

以下两种方法均适合大规模数据集,其中data.table在超大数据量下性能更优。

方法1:使用dplyr(tidyverse生态)

先将Date转换为日期格式,确保分组后按时间顺序取首尾得分,再计算差值并填充到分组内的每一行:

library(dplyr)

# 处理数据
b <- a %>%
  mutate(Date = as.Date(Date, format = "%Y/%m/%d")) %>%  # 转换日期格式
  group_by(ID) %>%  # 按用户ID分组
  mutate(diff_first_last = last(Score) - first(Score)) %>%  # 计算末次减首次得分的差值
  ungroup()  # 取消分组

方法2:使用data.table(适合超大规模数据)

data.table的分组操作速度更快、内存占用更低,适合处理百万级以上数据:

library(data.table)

# 转换为data.table格式
setDT(a)
# 转换日期格式并计算差值
a[, Date := as.Date(Date, format = "%Y/%m/%d")]
b <- a[, diff_first_last := last(Score) - first(Score), by = ID]

两种方法最终生成的b数据集均与期望结果一致,可直接应用于大规模数据处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:55:26