R语言从向量中按条件选取配对元素求最大值的高效实现方法
长向量分段按位置配对取最大值实现方案
需求说明
将输入向量按每6个元素为1个分段拆分,每个分段内前3个元素与后3个元素按位置一一对应,逐对取最大值,最终返回所有最大值组成的结果向量。
可复现示例
set.seed(1) A <- round(runif(12, min = 1, max = 5)) > A [1] 1 2 2 4 3 4 3 4 5 3 4 5 expectedResult <- c(max(A[1], A[4]), max(A[2], A[5]), max(A[3], A[6]), max(A[7], A[10]), max(A[8], A[11]), max(A[9], A[12])) > expectedResult [1] 4 3 4 3 4 5
高效解决方案
方案1:纯向量化矩阵运算(推荐,性能最优)
该方案无显式循环,完全依托R底层向量化运算逻辑,处理百万级以上长度的向量性能远优于循环类实现:
n <- length(A) # 转换为6行矩阵,每列对应一个长度为6的分段 mat <- matrix(A, nrow = 6, byrow = FALSE) # 前3行与后3行对应位置取最大值,展平为向量 result <- as.vector(pmax(mat[1:3, ], mat[4:6, ])) # 验证结果与预期一致 identical(result, expectedResult) # 输出:[1] TRUE
方案2:tidyverse风格实现(可读性优先)
如果更看重代码可读性,可使用该方案,性能略低于矩阵方案,但适配自定义规则调整的场景更灵活:
library(dplyr) result <- tibble(x = A) %>% # 生成分段编号、分段内位置 mutate(seg_id = (row_number() - 1) %/% 6, pos_in_seg = (row_number() - 1) %% 6 + 1) %>% # 拆分前3、后3子分组,生成配对位置 mutate(sub_seg = ifelse(pos_in_seg <= 3, 1, 2), pair_pos = ifelse(pos_in_seg <=3, pos_in_seg, pos_in_seg - 3)) %>% # 按分段和配对位置分组取最大值 group_by(seg_id, pair_pos) %>% summarise(max_val = max(x), .groups = "drop") %>% pull(max_val)
内容的提问来源于stack exchange,提问作者Rel_Ai
相关产品推荐
相关产品推荐

