如何按年份条件筛选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
相关产品推荐
相关产品推荐

