findInterval
和怎么样tapply
。findInterval
就像cut
,但没有转换为因子的开销
tapply(v,findInterval(v,w),function(x)x[which.max(f(x))])
# 1 2
# 4.7 12.0
或者如果你想要最大值
tapply(f(v),findInterval(v,w),max)
# 1 2
# 22.09 144.00
或者您可以使用您的函数对于所有正值都是单调递增的事实并执行此操作。
f(tapply(v,findInterval(v,w),max))
请注意,您需要指定边界处发生的情况(阅读帮助文件)
library(microbenchmark)
microbenchmark(
mnel = tapply(v,findInterval(v,w),max),
flodel = unname(vapply(split(f(v), cut(v, w), drop = TRUE), max, numeric(1L))),
flodel2 = unname(vapply(split(seq_along(v), findInterval(v, w)), function(i, v, fv)v[i][which.max(fv[i])], numeric(1L), v, f(v))))
# Unit: microseconds
# expr min lq median uq max neval
# mnel 260.945 262.9155 264.2265 276.0645 458.670 100
# flodel 331.218 334.3585 336.0580 351.1985 694.715 100
#flodel2 124.998 127.3230 128.5170 137.0505 354.545 100