如何用data.table找出2000-2003年存在缺失年份的Name取值?
解决方法:找出存在年份缺失的Name取值
当然有简洁高效的方法啦!既然你已经在用data.table,咱们就用它的分组特性来快速解决这个问题。先把你的数据集构造代码放出来方便参考:
library(data.table) y <- 2000:2003 DT = rbind(use.names = FALSE, data.table(Name = "A", Year = y), data.table("B", y[-3]), data.table("C", y[-c(1,4)]))
方法一:通过对比完整年份集合判断
首先定义目标年份区间的完整集合,然后按Name分组,检查每个组的年份是否和完整集合有差异:
# 定义2000-2003的完整年份 full_years <- 2000:2003 # 分组计算是否存在缺失年份,提取符合条件的Name missing_names <- DT[, .(has_missing = length(setdiff(full_years, Year)) > 0), by = Name][has_missing == TRUE, Name] # 输出结果 print(missing_names) # 结果:[1] "B" "C"
方法二:利用唯一年份数量快速判断
因为2000-2003一共是4个连续年份,所以只要某个Name对应的唯一年份数小于4,就说明至少缺失了一个年份。这种写法更简洁,而且data.table的uniqueN函数经过优化,效率很高:
# 简洁版:分组判断唯一年份数是否小于4 missing_names <- DT[, uniqueN(Year) < 4, by = Name][V1 == TRUE, Name] # 或者更直观的写法 missing_names <- DT[, if(uniqueN(Year) < length(full_years)) Name, by = Name][, unique(Name)] print(missing_names) # 结果:[1] "B" "C"
通用化扩展
如果你的年份区间不是固定的2000-2003,而是想基于数据中实际的年份范围来判断,也可以动态获取完整年份集合:
# 动态获取数据中的最小到最大年份作为完整区间 full_years <- min(DT$Year):max(DT$Year) missing_names <- DT[, uniqueN(Year) < length(full_years), by = Name][V1 == TRUE, Name]
这样不管年份区间是多少,都能自动适配啦!
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

