如何在R语言中自动化统计数据框中数值小于等于递增阈值的累计数量
轻松实现R中数值区间的自动累计统计
完全不用手动重复70次sum()语句!这里有几种简洁的自动化方案,帮你快速生成从30到2100、步长30的累计统计表格:
方法一:基础R原生实现(无需额外包)
先生成所有需要统计的BinWidth序列,再用sapply()批量计算每个区间的累计值:
set.seed(917) dat <- as.data.frame(sample(0:2100,100,replace = F)) colnames(dat)[1] <- "values" # 生成从30到2100、步长30的bin序列 bins <- seq(30, 2100, by = 30) # 批量计算每个bin对应的累计数量 counts <- sapply(bins, function(x) sum(dat$values <= x)) # 整理成目标格式的数据框 result <- data.frame( BinWidth = bins, TotalValuesLessThan = counts ) # 查看前几行结果(和你的示例格式一致) head(result)
输出结果:
| BinWidth | TotalValuesLessThan |
|---|---|
| 30 | 1 |
| 60 | 1 |
| 90 | 2 |
| 120 | 3 |
| 150 | 4 |
| 180 | 4 |
方法二:用dplyr+purrr实现(更直观易读)
如果你熟悉tidyverse工具链,这种写法更符合现代R的代码风格:
library(dplyr) library(purrr) set.seed(917) dat <- as.data.frame(sample(0:2100,100,replace = F)) %>% rename(values = 1) result <- tibble(BinWidth = seq(30, 2100, by = 30)) %>% mutate(TotalValuesLessThan = map_dbl(BinWidth, ~sum(dat$values <= .x))) # 同样可以用head(result)查看前几行
方法三:用ecdf函数(大数据场景更高效)
如果你的数据集很大,经验累积分布函数ecdf()会比逐个sum更高效,原理是先构建累积分布,再直接查询每个bin的累计比例,乘以总样本数得到数量:
set.seed(917) dat <- as.data.frame(sample(0:2100,100,replace = F)) colnames(dat)[1] <- "values" bins <- seq(30, 2100, by = 30) # 构建累积分布函数 ecdf_fun <- ecdf(dat$values) # 计算每个bin的累计数量(转成整数) counts <- as.integer(ecdf_fun(bins) * nrow(dat)) result <- data.frame(BinWidth = bins, TotalValuesLessThan = counts)
这三种方法都能自动生成到2100的所有统计结果,完全不用手动重复代码~
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

