r - 更有效的方式:selecting vec from a list

标签 r list function vector max

假设

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/

相关文章:

javascript - javascript变量/函数的首字母是什么意思

database - 如何将 Microsoft Access .accdb 数据库文件中的数据读入 R?

python - 使用类将整数列出为字符串

mysql - 在mysql中调用一个存储函数,但是得到错误:Subquery returns more than 1 row

php - file_get_content 和变量问题

C - 链表for循环疑问

r - 在 R data.table 中,根据另一列的值乘以列名

r - 包中的全局变量 - 更推荐哪种方法?

r - setNames 后缀到前缀

C - 合并两个字符串列表