如何按日期计算每个用户首次与末次得分的差值
按用户计算首次与末次得分差值的实现方案
需求说明
按用户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
相关产品推荐
相关产品推荐

