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
相关产品推荐
相关产品推荐

