基于data.table按Species与自定义区间统计Sepal.Length的计数与求和
用data.table按物种与自定义区间统计鸢尾花数据
核心思路
要实现按Species分类+自定义区间统计,同时保留无数据区间的0值,关键是先生成物种与区间的全组合,再和实际统计结果左连接,最后填充缺失值为0。
完整代码实现
library(data.table) # 1. 准备基础数据与区间 irisData <- as.data.table(iris) bins <- seq(4, length.out = 9, by = 0.5) aggtable <- data.table(bin1 = bins[-length(bins)], bin2 = bins[-1]) # 2. 生成物种与区间的所有可能组合(笛卡尔积) full_combinations <- CJ( Species = unique(irisData$Species), bin1 = aggtable$bin1, bin2 = aggtable$bin2, sorted = FALSE ) # 3. 对原始数据按物种、区间统计计数与求和 stats <- irisData[, { # 定位每个Sepal.Length对应的区间索引 interval_idx <- findInterval(Sepal.Length, bins) # 过滤有效区间(仅保留在定义范围内的数值) valid_idx <- interval_idx %in% seq_len(nrow(aggtable)) if (any(valid_idx)) { .(count = .N, sum_sepal = sum(Sepal.Length)), by = .(Species, interval_idx = interval_idx[valid_idx]) } else { data.table(Species = .BY$Species, interval_idx = integer(0), count = integer(0), sum_sepal = numeric(0)) } }] # 关联区间上下限 stats <- stats[aggtable, on = .(interval_idx = .I)] # 4. 左连接全组合,填充无数据的0值 final_result <- full_combinations[stats, on = .(Species, bin1, bin2), .( Species, bin1, bin2, count = fcoalesce(i.count, 0L), sum_sepal = fcoalesce(i.sum_sepal, 0) )] # 查看结果 print(final_result)
关键细节说明
- 全组合生成:用
CJ()(data.table的笛卡尔积函数)生成所有Species与区间的配对,确保没有数据的区间不会被遗漏。 - 区间定位:
findInterval()快速匹配数值所属区间,比cut()更高效,且直接对应aggtable的行索引。 - 缺失值填充:
fcoalesce()是data.table的高效填充函数,直接将左连接后的NA替换为0,保证统计完整性。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

