可重现的示例:
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”个元素,循环遍历列表
,使用创建一个
指定为2,转换为矩阵
>nrowdata.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/