假设
x = c(1, 2, 3.5, 4, 6, 7.5, 8, 9, 10, 11.5, 12)
y = c(2.5, 6.5)
I = split(x, findInterval(x, y))
f = function(vec, x) {
d = pmax(outer(x, vec, "-"), 0)
colSums(d - d^2/2)
}
我想计算每个区间的每个值中的f(I[[i]], x)
值,然后找到哪个I[[i]]
实际值在每个区间内具有f(I[[i]], x )
的最大值。
有没有比这个 for 循环更有效的其他方法:
for (i in 1:length(I)) {
max.values[[i]] = I[[i]][which.max(f(I[[i]], x))]
}
这是我想要得到的结果:
> max.values
[1] 2 6 10
最佳答案
如果您只是对删除 for 循环感兴趣。您可以通过以下方式将其替换为 lapply(.):
max.values <- unlist( lapply( I, function(v) v[which.max(f(v, x))] ) );
只有当 length(I) 很大时,这才会产生影响。 为了获得更好的性能,看看是否可以简化 f(.) 只是为了找到最大值。 为了获得最佳优化,您应该考虑用 C、C++ 或 Fortran 重写性能关键部分。
当数据向量变大、存在冗长循环或可用数据结构不适合该任务时,R 可能极其慢。 就像一个轶事一样,我编写了一个无“for-loop”的 R 代码,该代码在 2 周的 Wall time(输入数组:n ~ 1e6)后被杀死。 (R 代码在 n ~ 1e4 的输入上运行良好)。 C++ 等效代码需要 1 分钟。稍微优化的 C++ 代码花了 10 秒...
关于r - 更有效的方式:selecting vec from a list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392980/