【问题标题】:Derive the result of a formula for each combination of three input parameters为三个输入参数的每个组合推导公式的结果
【发布时间】:2016-11-09 18:15:53
【问题描述】:

我一直在努力解决 R 中的一个问题,并尝试了 google 和搜索功能,但没有找到解决方案。

我想做以下事情:

推导出一组期限、金额和利率组合的利率支付收入。集合定义如下:

  1. 金额 (a) = 1,000 - 25,000,间隔为 100
  2. 持续时间 (d) = 12 - 60(月),间隔为 6
  3. 利率 (i) 0.00 - 0.015,间隔为 0.001

公式如下:w = ad(((i/12)*(1+(i/12))^(d))/((1+(i/ 12))^(d)-1)) - 一个 ,其中 w 是利率支付。

我的解决方案是使用三个“for”循环计算 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 某个值的所有可能组合。

非常感谢您!

最好的,亚历克斯

【问题讨论】:

  • 照原样,您需要将 for 循环中的 w 保存到某些数据结构中。现在你正在生成一堆 w 的值,但只是不断地覆盖它而不将它存储在任何地方。

标签: r loops rbind


【解决方案1】:

以下是调整当前方法的方法:

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]

【讨论】:

  • 哇,不知道expand.grid。太棒了。
  • 您能否像处理 data.table 一样将函数传递给数据帧,以查看速度增益。
  • @user20650: result$w &lt;- result$amount*result$duration*(((result$interest/12)*(1+(result$interest/12))^(result$duration))/((1+(result$interest/12))^(result$duration)-1)) - result$amount
  • 我不确定这里的data.table 部分是什么。您刚刚使用了*+\ 等被矢量化的事实。相反,您实际上可以使用data.tableCJ 而不是expand.grid)的唯一地方实际上并没有使用它。我很困惑。
  • @DavidArenburg 没错,在这种情况下不需要它。想要提供一个他可以为任何类型的操作构建的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多