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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:12:39