返回 R 中向量中条件选择对的最大值

标签 r vector conditional-statements max pairwise

可重现的示例:

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

每个 A 需要被视为具有 6 个元素的段的集合。例如,这里的A有A[1:6]和A[7:12]等2个段。对于每个段,前 3 个元素与接下来的 3 个元素进行比较。因此我需要采取 max(A[1],A[4]), max(A[2], A[5]), 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])

我的原始向量比这个例子有更多的元素,因此我需要一个更简单的方法来做到这一点。此外,速度也是原始计算的一个因素,因此也在寻找快速的解决方案。

最佳答案

我们可以创建一个函数来将向量分割为“n”个元素,循环遍历列表,使用创建一个矩阵 >nrow指定为2,转换为data.frame后使用pmax进行elementwise max,通过返回输出>取消列出列表

f1 <- function(vec, n) {
       lst1 <- split(vec, as.integer(gl(length(vec), n, length(vec))))
       unname(unlist(lapply(lst1, function(x) 
       do.call(pmax, as.data.frame(t(matrix(x, nrow = 2, byrow = TRUE)))))))
}

-输出

> f1(A, 6)
[1] 4 3 4 3 4 5

如果长度不是3或6的倍数,另一种选择是在分割后用tapply进行group by操作

unname(unlist(lapply(split(A, as.integer(gl(length(A), 6, 
    length(A)))), function(x) tapply(x, (seq_along(x)-1) %% 3 + 1, FUN = max))))
[1] 4 3 4 3 4 5

数据

A <- c(1, 2, 2, 4, 3, 4, 3, 4, 5, 3, 4, 5)

关于返回 R 中向量中条件选择对的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68840591/

相关文章:

r - 为整数生成数字分区

c++ - 使用作为对 vector 元素的引用的参数调用 c++ 函数

c# - 为什么 System.Numerics 命名空间中没有 Matrix3x3? C#

lua - Lua 中的内联条件 (a == b ? "yes": "no")?

python - 如何根据多个条件(包括 'isnull' 、 'or' 和 if colB 'isin' colA 等语句)创建新的 pandas 列?

r - 创建空间点数据框

r - data.table:表中所有现有组合的总和

r - 无法修复 R 中未找到的对象 'dataset'

c++ - 从指针 vector 调用函数

javascript - 对象中的条件变量