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

如何识别R语言中累积和向量首次超过指定阈值的位置

识别累积和向量中首次超过指定阈值的位置

我明白你要解决的是从带命名的累积和向量里,找出每个阈值首次被超过的对应名称或位置。结合你的示例数据,这里有几种简洁高效的方法,分场景给你说明:

单阈值场景:快速定位单个阈值的首次超过位置

如果只需要处理单个阈值(比如25),可以用which()结合索引操作快速实现:

# 设定单个阈值
threshold <- 25
# 先找所有<=阈值的累积和索引,取最大的那个加1就是首次超过的位置
first_over_idx <- max(which(cumsums <= threshold)) + 1
# 取出对应的名称
first_over_name <- names(cumsums)[first_over_idx]

first_over_name

对应你的示例数据,这个结果会是"C"——因为前两项累积和9.9、19.2都小于25,第三项28.5才首次超过阈值。

多阈值批量处理:一次性搞定多个阈值

如果你要同时处理25、50、75、90这一组阈值,findInterval()是最高效的选择,能直接批量返回每个阈值的对应位置:

# 设定要处理的多组阈值
thresholds <- c(25, 50, 75, 90)
# findInterval返回每个阈值落在累积和区间的前一个索引,加1就是首次超过的位置
positions <- findInterval(thresholds, cumsums) + 1
# 映射到对应的名称,并给结果加上阈值标签
result <- names(cumsums)[positions]
names(result) <- thresholds

result

运行后你会得到清晰的对应结果:25对应"C",50对应"F"(E的累积和46.07还没到50,F的54.38首次超过),剩下的可以自行验证。

直观易懂的tidyverse风格处理

如果你习惯用tidyverse工具链,用purrr的map_chr()可以更直观地逐个处理每个阈值:

library(purrr)

thresholds <- c(25, 50, 75, 90)
# 遍历每个阈值,直接取第一个超过阈值的索引对应的名称
result <- map_chr(thresholds, ~ names(cumsums)[min(which(cumsums > .x))])
names(result) <- thresholds

result

这种写法逻辑直白,适合新手理解,本质是逐个筛选每个阈值的首个超标位置。

结合你的示例数据验证

用你给出的前6项累积和:

A B C D E F
9.902633 19.240766 28.531703 37.537920 46.065978 54.380480

  • 阈值25:首次超过的是C(28.53)
  • 阈值50:首次超过的是F(54.38)

这些方法都能精准得到你需要的结果,你可以根据自己的使用场景选择最顺手的一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:52