Я использую следующий цикл 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 .