for循环替代分组数据以计算条件滚动最大值和最小值的有效替代方法

时间:2019-02-21 04:08:10

标签: r performance data.table query-performance

我在代码中使用以下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 所需的滚动值表中每个组的下一个 HLM LUM 的值。关于我的 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

我的代码的逻辑是这样的:

  • g1,g2 是分组变量
  • v1 确定每个组中的行顺序(升序)
  • RRP 是兴趣价值
  • 可用是一个条件变量。如果为false,请将 HLM LUM 设置为默认值
  • FORSALE 是一个条件变量,用于在AVAILABLE为true时计算HLM和LUM。
  • ACCEPT 是一个条件变量,可以增加最低上边距的值,这可能需要对 HLM 进行调整,以使其永远不会大于 LUM
  • 拒绝是一个条件变量,与接受具有相似的作用,不同之处在于 HLM 会覆盖 LUM < / strong>。

0 个答案:

没有答案