如何用R语言zoo包的rollapply函数获取滚动三元组最大值的位置
用zoo包rollapply获取滚动窗口内最大值的位置
核心解决方案
通过自定义函数配合rollapply,可以实现3个数据滚动窗口内最大值的位置计算,以下是具体代码示例:
- 加载包并创建示例数据
library(zoo) # 示例数据框,可替换为你的真实数据 df <- data.frame(value = c(5, 2, 8, 3, 10, 4, 6))
- 计算窗口内最大值的相对位置(窗口内的1/2/3)
定义函数返回窗口内最大值的相对索引,再用rollapply批量计算:
# 自定义函数:返回窗口内最大值的相对位置 get_max_rel_pos <- function(x) which.max(x) # 生成目标列,不足3个数据的位置填充NA df$position.of.max.group.of.three <- rollapply( df$value, width = 3, # 滚动窗口大小 FUN = get_max_rel_pos, fill = NA, # 窗口不足时填充NA align = "right" # 结果对应窗口最后一个元素的位置 )
- (可选)计算最大值在原数据中的绝对索引
如果需要的是原数据的行号而非窗口内相对位置,可调整函数:
# 自定义函数:返回最大值在原数据中的绝对位置 get_max_abs_pos <- function(x) { # 获取当前窗口对应的原数据索引 window_idx <- attr(x, "index") window_idx[which.max(x)] } df$abs_position.of.max.group.of.three <- rollapply( df$value, width = 3, FUN = get_max_abs_pos, fill = NA, align = "right" )
关键参数说明
align:控制窗口对齐方式,"right"表示结果对应窗口最后一个元素(如第3行结果对应前3个数据),"left"对应窗口第一个元素,"center"对应窗口中间元素partial=TRUE:如果想让前两个窗口(不足3个数据)也计算最大值位置,可添加该参数,此时第1行返回1,第2行返回最大值在两个数据中的位置
查看结果
运行上述代码后,查看数据框:
df
输出示例:
value position.of.max.group.of.three abs_position.of.max.group.of.three 1 5 NA NA 2 2 NA NA 3 8 3 3 4 3 2 3 5 10 3 5 6 4 2 5 7 6 2 5
内容的提问来源于stack exchange,提问作者Vinicius B. de S. Moreira
相关产品推荐
相关产品推荐

