首页 > 解决方案 > 有效替代 for 循环分组数据以计算条件滚动最大值和最小值

问题描述

我在我的代码中使用以下 for 循环来获取数据表中值的最低上限和最高下限。

我的数据如下所示:

g1  g2  v1   RRP  AVAILABLE  FORSALE  ACCEPT  REJECT  
 A   1  -29   55          1        1       0       0 
 A   1  -28   45          1        0       0       1  
 A   1  -27   51          1        0       0       1 
 A   1  -26   50          1        1       1       0  
 A   1  -25   48          1        0       0       0 
 A   1  -24   37          1        1       1       0 
 A   1  -23   39          1        1       0       0  
 A   1  -22   35          1        0       0       1  
 A   1  -21   32          1        0       0       0  
 A   1  -20   45          1        1       0       0  
 A   1  -19   50          1        1       1       0 
 A   1  -18   44          0        1       0       0  

这是我正在使用的 for 循环。我不确定如何提高此代码的性能,因为我想不出更好的方法来处理 HLM 和 LUM 的滚动值,这些计算表中下一个HLMLUM的值所需的,对于每个组. 关于我的 for 循环设置中的数字31,每组中正好有31行数据。

for(i in 1:nrow(d1)/31){
    HLM <- -1000
    LUM <- 10000
    for(j in 1:31){
        x <- x+1
        if(d1$AVAILABLE[x]){
            d1$HLM[x] <- ifelse(!d1$ACCEPT[x]&!d1$FORSALE[x],max(d1$RRP[x],HLM),
                          min(d1$RRP[x],HLM))
            HLM <- d1$HLM[x]
            d1$LUM[x] <- ifelse(!d1$REJECT[x]&d1$FORSALE[x],min(d1$RRP[x],LUM),
                          max(d1$RRP[x],LUM))
            LUM <- d1$LUM[x]
        if(LUM < HLM & d1$ACCEPT[x]){
            d1$HLM[x] <- d1$LUM[x]
            HLM <- LUM
        }
        if(LUM < HLM & d1$REJECT[x]){
            d1$LUM[x] <- d1$HLM[x]
            LUM <- HLM
        }
    }
    if(!d1$AVAILABLE[x]){
        d1$HLM[x] <- -1000
        d1$LUM[x] <- 10000
}

返回的值如下所示:

g1  g2  v1   RRP  AVAILABLE  FORSALE  ACCEPT  REJECT  cMax  cMin
 A   1  -29   55          1        1       0       0    50 -1000  
 A   1  -28   45          1        0       0       1    50    45  
 A   1  -27   51          1        0       0       1    51    51
 A   1  -26   50          1        1       1       0    50    50
 A   1  -25   48          1        0       0       0    50    48
 A   1  -24   37          1        1       1       0    37    37
 A   1  -23   39          1        1       0       0    39    37
 A   1  -22   35          1        0       0       1    39    35 
 A   1  -21   32          1        0       0       0    36    35
 A   1  -20   45          1        1       0       0    45    35
 A   1  -19   50          1        1       1       0    45    35   
 A   1  -18   44          0        1       0       0    44    35

我的代码逻辑是这样的:

标签: rperformancedata.tablequery-performance

解决方案


推荐阅读