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

R语言如何快速统计向量落在各相邻区间内的数值个数

R语言快速统计区间频数的实现

首先复现题目给出的测试数据:

set.seed(123)
a = runif(10000) / 2
intervals = seq(0, 0.5, 0.001)

性能最优写法(推荐)

用R内置的findInterval()搭配tabulate()实现,底层为C语言实现,无多余计算,哪怕百万级以上的向量也能秒出结果:

# 标记a中每个元素所属的区间序号
interval_id <- findInterval(a, intervals, rightmost.closed = TRUE)
# 对序号直接计数,运行效率远高于table函数
count_res <- tabulate(interval_id, nbins = length(intervals) - 1)
# 拼接符合要求格式的区间标签
label_res <- paste(
  sprintf("%.3f", head(intervals, -1)),
  "-",
  sprintf("%.3f", tail(intervals, -1))
)
# 组装为最终结果表
final_res <- data.frame(
  interval = label_res,
  count = count_res
)

运行后输出final_res即可得到要求格式的结果,前几行实际运行结果参考:

interval count
1 0.000 - 0.001    22
2 0.001 - 0.002    21
3 0.002 - 0.003    20

简短写法(小数据量适用)

如果数据量不大,想要更精简的代码,可以直接用cut()+table()一步生成结果,不需要手动拼接区间标签:

final_res <- as.data.frame(
  table(interval = cut(a, breaks = intervals, include.lowest = TRUE, dig.lab = 3))
)
colnames(final_res)[2] <- "count"

该写法代码更短,但数据量超过百万级时,运行速度会明显慢于上面的findInterval写法。

参数说明:代码中rightmost.closed = TRUE和include.lowest = TRUE的作用是保证刚好等于区间最大值0.5的元素不会被漏算,默认分箱规则为左开右闭,即数值大于区间左端点、小于等于区间右端点时计入对应区间,如果需要调整区间开闭规则,修改对应函数的参数即可。

内容的提问来源于stack exchange,提问作者user438383

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:51:09