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

使用data.table在多分组变量场景下从重复行筛选非NA值

修改方案

你只需要调整两处代码逻辑即可适配多分组场景:

  1. 排序字段新增year,保证id+year的组合分组内的行按规则排序
  2. 去重判断维度从仅id改为id+year双字段,同时输出列新增year

调整后完整代码

library(data.table)

dt_id_year_and_type        <- as.data.table(df_id_year_and_type)
dt_id_year_and_type$typena <- is.na(dt_id_year_and_type$type)
# 新增year到排序字段,id、year均用升序即可
setorderv(dt_id_year_and_type, c("typena","id", "year"), order = c(-1, 1, 1))
# duplicated按id+year双字段判断重复,输出列补充year
res <- dt_id_year_and_type[!duplicated(dt_id_year_and_type[, .(id, year)], fromLast = TRUE), .(id, year, type)]
print(res)

运行结果

id year type
1:  1 2002    A
2:  2 2008    B
3:  3 2010    D
4:  3 2013 <NA>
5:  4 2020    C
6:  5 2009    A
7:  6 2010    B
8:  6 2012 <NA>

和你的预期输出完全一致。


更简洁的扩展写法(可选)

如果不需要复用原有排序逻辑,也可以直接用data.table的分组聚合语法实现,后续新增分组字段直接往by参数里添加即可,不需要调整其他逻辑:

dt_id_year_and_type[, .(type = {
  valid_vals = na.omit(type)
  if (length(valid_vals) == 0) NA_character_ else last(valid_vals)
}), by = .(id, year)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:45:04