Эффективная альтернатива для цикла по сгруппированным данным для расчета условного макс. И мин. - PullRequest
0 голосов
/ 21 февраля 2019

Я использую следующий цикл 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 в таблице для каждой группы.Что касается числа 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 - это условная переменная, используемая для вычисления HLM и LUM, когда AVAILABLE имеет значение true.
  • ACCEPT является условной переменной, которая может увеличить значение нижнего верхнего предела, что может потребовать корректировки HLM в ответ так, чтобы она никогда не превышала LUM
  • REJECT - это условная переменная, которая имеет эффект, аналогичный ACCEPT , за исключением HLM вместо LUM .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...