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

如何按年份条件筛选data.table?缺失时取每组最近年份数据

解决data.table按组匹配指定/最近年份数据的问题

需要按Year筛选data.table,逻辑是:

  • 每组优先获取匹配指定年份的数据
  • 若该组无指定年份的记录,取距离指定年份最近的记录
  • 最终要确保所有组都有对应结果,不会出现缺失组的情况

示例数据

library(data.table)

# 生成示例数据
dt <- data.table(Group = c(rep("A", 5),rep("B", 3),rep("C", 5),rep("D", 2)), 
                 x = sample(1:10,15, rep=T), 
                 Year = c(2011:2015, 2013:2015, 2011:2015, 2014:2015))

问题重现

指定年份y=2012时,尝试以下代码:

y <- 2012
dt[Year == which.min(abs(Year - y)), .SD, by = Group]

运行后得到空表:Empty data.table (0 rows and 3 cols): Group,x,Year

期望结果:

Group x Year
1:     A 4 2012
2:     B 7 2013
3:     C 2 2012
4:     D 3 2014

正确解法

之前的代码错误在于which.min(abs(Year - y))是对整个数据集计算位置,而非分组内计算。需要在每个分组内单独筛选最近年份的记录。

方法1:分组内直接筛选最近记录

这是最简洁的写法,在每个Group内找到与目标年份距离最小的记录:

y <- 2012
dt[, .SD[which.min(abs(Year - y))], by = Group]

也可以通过排序后取首行实现:

y <- 2012
dt[, .SD[order(abs(Year - y))[1]], by = Group]

方法2:新增距离列后筛选

如果需要查看每个记录与目标年份的距离,可以先新增列再筛选:

y <- 2012
dt[, dist := abs(Year - y)][, .SD[dist == min(dist)], by = Group][, dist := NULL]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:31:09