使用data.table在多分组变量场景下从重复行筛选非NA值
修改方案
你只需要调整两处代码逻辑即可适配多分组场景:
- 排序字段新增
year,保证id+year的组合分组内的行按规则排序 - 去重判断维度从仅
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
相关产品推荐
相关产品推荐

