如何用R的data.table包实现类似COUNTIFS与SUMIFS的条件计数和求和?
在R中用data.table实现COUNTIFS和SUMIFS功能
初始代码
library(data.table) treesData <- as.data.table(trees) bins <- seq(63, length.out = 10, by = 3) aggtable <- data.table(bin1 = bins[-length(bins)], bin2 = bins[-1])
需求说明
需要为aggtable中的每个区间[bin1, bin2),计算两个指标:
- Count:
treesData中Height落在该区间内的记录数(对应COUNTIFS) - Girth.total:
treesData中该区间内所有Girth的求和(对应SUMIFS)
解决方案
方法1:逐行筛选聚合(适合小数据集)
直接在aggtable中按区间分组,筛选对应数据并计算统计量:
aggtable[, `:=`( Count = treesData[Height >= bin1 & Height < bin2, .N], Girth.total = treesData[Height >= bin1 & Height < bin2, sum(Girth)] ), by = .(bin1, bin2)]
方法2:用foverlaps高效连接(适合大数据集)
通过区间重叠连接实现更高效的分组统计:
# 为treesData添加点区间(每个Height对应[Height, Height]) treesData[, `:=`(Height_start = Height, Height_end = Height)] # 设置连接键 setkey(aggtable, bin1, bin2) setkey(treesData, Height_start, Height_end) # 重叠连接后聚合 result <- foverlaps(treesData, aggtable, type = "within")[, .( Count = .N, Girth.total = sum(Girth) ), by = .(bin1, bin2)]
执行后,aggtable(方法1)或result(方法2)会生成符合需求的结果,包含每个区间的计数和求和值。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

