Беда с л oop в р - PullRequest
       9

Беда с л oop в р

0 голосов
/ 09 февраля 2020

Я все еще довольно новичок в программировании на R, и циклы всегда меня сбивают с толку. То, что я пытаюсь сделать, это сравнить мою способность требовать и взять меньшее из двух значений для расчета прибыли. В приведенном ниже примере в 6-й позиции емкость составляет 55 000, но спрос составляет 56 074,44, поэтому я могу производить только свою емкость.

Текущий код:

UnitCost <- 3.70
Capacity <- c(30000, 35000, 40000, 45000, 50000, 55000, 60000)

Profit <- c()
for (i in 1:length(Capacity)) {
  Demand <- rnorm(n = 1, mean = 50000, sd = 12000)
  Revenue[i] <- min(Demand, Capacity[i]) * UnitCost
  Profit[i] <- sum(Revenue[i])
}
demand
Profit

Вывод:

> Demand
[1] 56074.44
> Profit
[1] 111000.0 129500.0 148000.0 166500.0 185000.0 118181.7 207475.4

Требуется вывод:

> Demand
[1] 56074.44
> Profit
[1] 111000.0 129500.0 148000.0 166500.0 185000.0 203500.0 207475.4

Ответы [ 3 ]

1 голос
/ 09 февраля 2020

Код, который вы указали, неполон. У меня есть пара вопросов -

  • Ваш спрос постоянен? Почему вы присваиваете ему значение l oop?
  • Что такое 'd' в строке, где вы присваиваете значение Выручка?

Я предполагаю, что d 'это требование, и я переписал ваш код, который, кажется, дает желаемый вывод.

UnitCost <- 3.70
Capacity <- c(30000, 35000, 40000, 45000, 50000, 55000, 60000)
demand <- 56074.44

Profit <- c()
Revenue <- c()

for (i in 1:length(Capacity)) {
    Revenue[i] <- min(demand, Capacity[i]) * UnitCost
    Profit[i] <- sum(Revenue[i])
}

demand
Profit

Вывод -

demand
[1] 56074.44
Profit
[1] 111000.0 129500.0 148000.0 166500.0 185000.0 203500.0 207475.4
0 голосов
/ 09 февраля 2020

На самом деле вам не нужны for l oop для *apply функций, а pmin может помочь вам получить желаемый результат

Demand <- rnorm(length(Capacity),mean = 50000, sd = 12000)
Profit <- pmin(Capacity,demand) * UnitCost

, такой что

> Profit
[1] 111000.0 129500.0 148000.0 166500.0 185000.0 203500.0 207475.4
0 голосов
/ 09 февраля 2020

Сначала я бы использовал sapply вместо for l oop следующим образом:

sapply(Capacity, function(cap){
  sum(min(demand, cap) * UnitCost)
})

Это даст вам следующий вывод для demand, указанного в вашем вопросе:

# 111000.0 129500.0 148000.0 166500.0 185000.0 203500.0 207475.4

РЕДАКТИРОВАТЬ: Чтобы применить это к многолетним требованиям, вы можете сделать следующее:

num.years <- 1:5
sums <- data.frame(t(sapply(num.years, function(i){
  set.seed(i-1)
  demand <- rnorm(n = 1, mean = 50000, sd = 12000)
  sapply(Capacity, function(cap){
    sum(min(demand, cap) * UnitCost)
  })
})))
row.names(sums) <-  paste0("Year_", num.years)
colnames(sums) <-  Capacity
sums

Это даст вам следующий результат:

#          30000   35000     40000     45000     50000     55000     60000
# Year_1  111000  129500  148000.0  166500.0  185000.0  203500.0  222000.0
# Year_2  111000  129500  148000.0  166500.0  180392.6  180392.6  180392.6
# Year_3  111000  129500  148000.0  160263.8  160263.8  160263.8  160263.8
# Year_4  111000  129500  148000.0  166500.0  185000.0  203500.0  222000.0
# Year_5  111000  129500  145352.7  145352.7  145352.7  145352.7  145352.7

Надеюсь, это поможет.

...