2016-11-09 2 views
2

Я боролся с проблемой в R и попробовал Google и функцию поиска, но не нашел решения.Вывести результат формулы для каждой комбинации из трех входных параметров

Я хотел бы сделать следующее:

Выведите доход оплаты процентной ставки для набора комбинаций длительности, количества и процентной ставки. Набор определяются следующим образом:

  1. сумма (а) = 1,000 - 25,000 с интервалами 100
  2. Продолжительность (D) = 12 - 60 (месяцев) с интервалом 6
  3. процентной ставки (I) 0,00 - 0,015 с интервалами 0,001

формула выглядит следующим образом: ш = а д (((я/12) * (1+ (я/12))^(г))/((1+ (i/12))^(d) -1)) - a , где w - процентная ставка.

Моим решением было рассчитать w с тремя циклами «для» и сохранить данные командой «rbind». К сожалению, это не работает для меня:

result = NULL 

amount <- seq(1000, 25000, by=100) 

duration <- seq(12, 60, by=6) 

interest <- seq(0, 0.015, by=0.0001) 

for (d in duration){ 
    for (a in amount){ 
     for (i in interest){ 
     w = a*d*(((i/12)*(1+(i/12))^(d))/((1+(i/12))^(d)-1)) - a 
     } 
    } 
} 

result = rbind(d, data.frame(d, a, i, w)) 

Что я делаю неправильно? Я нахожусь на правильном пути? Результатом должен быть список со всеми возможными комбинациями и значением «w». В качестве альтернативы, выход может быть списком со всеми возможными комбинациями для определенного значения для w.

Большое вам спасибо!

Лучший, Алекс

+0

Как вам нужно сохраните w в цикле for в некоторой структуре данных. Прямо сейчас вы генерируете кучу значений w, но просто постоянно переписываете его, не сохраняя его нигде. – BLT

ответ

3

Вот как настроить свой текущий подход:

amount <- seq(1000, 25000, by=100) 
duration <- seq(12, 60, by=6) 
interest <- seq(0, 0.015, by=0.0001) 
result <- expand.grid(amount, duration, interest) 
names(result) <- c("amount", "duration", "interest") 

for(i in 1:nrow(result)){ 
    result$w[i] <- result$amount[i]*result$duration[i]*(((result$interest[i]/12)*(1+(result$interest[i]/12))^(result$duration[i]))/((1+(result$interest[i]/12))^(result$duration[i])-1)) - result$amount[i] 
} 

Однако data.table это примерно в миллион раз быстрее:

library("data.table") 
amount <- seq(1000, 25000, by=100) 
duration <- seq(12, 60, by=6) 
interest <- seq(0, 0.015, by=0.0001) 
result <- expand.grid(amount, duration, interest) 

setDT(result) 
setnames(result, c("Var1", "Var2", "Var3"), c("amount", "duration", "interest")) 
result[, w := amount*duration*(((interest/12)*(1+(interest/12))^(duration))/((1+(interest/12))^(duration)-1)) - amount] 
+1

Ничего себе, не знал о 'expand.grid'. Потрясающие. – BLT

+0

вы можете передать функцию в dataframe, как вы это делаете с data.table, чтобы увидеть прирост скорости. – user20650

+0

@ user20650: 'result $ w <- result $ amount * result $ duration * ((результат $ interest/12) * (1+ (результат $ interest/12))^(результат $ duration))/((1 + (результат $ interest/12))^(результат $ duration) -1)) - результат $ amount ' – ddunn801

Смежные вопросы