在R中循环有序集的功能方法

时间:2015-04-08 18:20:06

标签: r functional-programming

我正在尝试优化R中的算法,该算法在一组有序的值上运行,并确定是否存在“未来”(在集合的下方)具有低于给定值的值的值。

例如:

+-------+--------------------------------+
| Value | RestOfSeriesContainsLowerValue |
+-------+--------------------------------+
| 5     | true                           |
| 4     | true                           |
| 2     | true                           |
| 1     | false                          |
| 3     | true                           |
| 4     | true                           |
| 4     | true                           |
| 3     | true                           |
| 3     | true                           |
| 2     | false                          |
| 2     | false                          |
| 2     | false                          |
| 7     | false                          |
| 8     | false                          |
| 9     | false                          |
| ...   | ...                            |
+-------+--------------------------------+

本地最小值是值1和2.因此,此集合中第一个项目的RestOfSeriesContainsLowerValue的值为true - 因为在该集合中具有值(1)的值较低。

在1值之后 - 3和4值的值为true,因为新的局部最小值(值2)将在集合中稍后出现。

我们目前正在使用一个运行在伪编码中的for循环:

for (i in set) {
   if(value(i) <=  min(set[,i:end])) 
     RestOfSeriesContainsLowerValue(i) = true
   else
    RestOfSeriesContainsLowerValue(i) = false
}

然而,这还不够有效。我正在寻找一种基于集合/功能的方式在R中写这个但是无法理解它。我可以使用lapply来执行此操作吗?

1 个答案:

答案 0 :(得分:2)

使用lapply的函数R代码中的伪代码

f <-function(value) unlist(lapply(seq_along(value), function(i)if(value[i] <=  min(value[i:length(value)]))FALSE else TRUE))

用于实现相同目标的矢量化代码是

f1 <- function(value)value > rev(cummin(rev(value)))

根据样本大小,矢量化代码可以任意更快。对于n=1001000的速度提高约10倍,速度提高100倍,10000提高约1000倍

value <- sample(1:100, 1000, replace = TRUE)
microbenchmark::microbenchmark(f(value), f1(value), unit="relative")
#Unit: relative
#     expr      min       lq     mean   median       uq      max neval
# f(value) 172.3758 174.2449 124.1607 107.5502 104.8017 96.85548   100
#f1(value)   1.0000   1.0000   1.0000   1.0000   1.0000  1.00000   100