优化迭代计算避免R上的循环

时间:2017-01-19 18:35:08

标签: r loops optimization iteration knime

我必须对R中data.frame的行应用迭代计算。 问题是,对于每一行,结果取决于先前计算的结果和先前的行。

我使用类似以下示例的循环实现了解决方案:

for /F "delims=" %%F in ('
    xcopy /L /I /S ".\*.txt" "%TEMP%" ^| find ".\"
') do (
    echo(Relative path to file: "%%~F"

    rem // This block is only needed in case the leading `.\` disturbs:
    set "FILE=%%~F"
    setlocal EnableDelayedExpansion
    echo(Relative path, no `.\`: "!FILE:*.\=!"
    endlocal
)

问题是真正的代码非常慢(特别是如果我在KNIME的R片段中使用它)

有没有办法以更高效的R-like方式优化代码?我尝试使用apply系列,但它似乎不适用于我的情况。

非常感谢

1 个答案:

答案 0 :(得分:1)

以下是使用累计data.table分组

flag_new次努力
set.seed(1)
example <- data.frame(flag_new = c(TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE),
                      percentage =sample(1:100,22)/100)    

# initialization
initK = 100

# Copy to allow comparison to your code
newd = example

library(data.table)
setDT(newd)[, Knew:= initK* c(1, cumprod(1 - percentage[-.N])), 
                              by=cumsum(flag_new)][, Rnew:=Knew* percentage]

在问题中运行循环后比较结果

all.equal(example$K, newd$Knew) 
all.equal(example$R, newd$Rnew)

将计算从第一个TRUE分组到下一个d = example[1:8, ] d$K1 <- d$K* c(1, cumprod(1 - d$percentage[-length(d$percentage)])) d$R2 <- with(d, K1* percentage) 计算可以在没有循环的情况下完成。

例如,使用第一组计算可以作为

完成
k[i] = k[i-1] - R[i-1] 
k[i] = k[i-1] - k[i-1]* p[i-1] 
     = k[i-1](1 - p[i-1])
So 
k[2] = k[1]* (1-p[1])
k[3] = k[2]* (1-p[2]) = k[1]* (1-p[1])* (1-p[2])
k[4] = k[3]* (1-p[3]) = k[1]* (1-p[1])* (1-p[2])* (1-p[3])
and so on..

这来自

data.table

所以只需要一个split,apply,combine方法,为每个组计算这些 我用过{{1}}