Для цикла возвращает повторяющиеся значения NA - PullRequest
0 голосов
/ 14 июня 2019

Я хочу использовать этот цикл для определения прибыли, получаемой в результате каждой из "ставок", которые я разместил в своем векторе MillerBids.На выходе должен быть вектор с 10 элементами.Проблема в том, что этот код возвращает только повторяющиеся значения NA.

Я предполагаю, что ошибка либо где-то в моем индексировании, либо сбрасывает мои переменные и векторы.Это две вещи, которые мне трудно понять при работе с более сложными циклами.

library(triangle)

MillerBids = c(10500,11000,11500,12000,12500,13000,13500,14000,14500,15000)

CostToBid = 350
ProjCost = 10000
Comps = 4

MillerProfs = c()
for (MillerBid in MillerBids) {
  CompBids = c()
  MillerProf = 0
  for (Comp in 1:Comps) 
    CompBids[Comp] = MillerBid * rtriangle(1, a=0.9, b=1.8, c=1.3)
  MinComp = min(CompBids)
  if (MillerBid < MinComp) {
    MillerProf = MillerBid - (CostToBid + ProjCost)
  } else { 
    MillerProf = 0 - CostToBid 
  }
  MillerProfs[MillerBid] = MillerProf
}
MillerProfs

возвращает: [1] NA NA NA NA NA NA NA NA ... несколько тысяч раз

Я знаю о преимуществах использования семейства функций apply(), но для этого конкретного случая мне нужноиспользовать это для цикла, и мне также нужно улучшить мое понимание их.

Как я уже сказал, цель состоит в том, чтобы MillerProfs был вектором с 10 элементами, каждый из которых представляет собой число прибыли, относящееся к значениям в MillerBids.

1 Ответ

3 голосов
/ 14 июня 2019

В вашем коде, когда вы делаете

MillerProfs[MillerBid] = MillerProf

в первой итерации MillerBid значение было 10500, первое значение в векторе MillerBids, следовательно, вычисленное значение (MillerProf) было сохранено с этим индексом, и все средние значения были обращены к NA.

Это как делать

x = numeric()
x[5] = 10
x
#[1] NA NA NA NA 10

Аналогично, в вашем случае все первые 10499 значений были NA, и у вас было фактическое значение, хранящееся в индексе 10500. То же самое произошло с остальными итерациями.

Вместо этого попробуйте перебрать его индекс

library(triangle)

MillerProfs <- numeric(length(MillerBids))

for (i in seq_along(MillerBids)) {
   CompBids = 0
   MillerProf = 0
   for (Comp in 1:Comps) 
      CompBids[Comp] = MillerBids[i] * rtriangle(1, a=0.9, b=1.8, c=1.3)
   MinComp = min(CompBids)
   if (MillerBids[i] < MinComp) {
     MillerProf = MillerBids[i] - (CostToBid + ProjCost)
  } else { 
      MillerProf = 0 - CostToBid 
  }
  MillerProfs[i] = MillerProf
}


MillerProfs
# [1]  150  650 1150 1650 2150 2650 3150 3650 4150 4650
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...