【问题标题】:How to do this without a for loop in R?如何在 R 中没有 for 循环的情况下做到这一点?
【发布时间】:2018-04-22 15:56:54
【问题描述】:

我有 3 列:

  1. 分期付款
  2. 兴趣
  3. 曝光

第一行是这样的

  installment interest exposure

    0          0        1000

第 1 行的分期付款为 0,之后为固定数字。让它成为 100。

第 i 行的利息 = 0.5% * 第 (i-1) 行的曝光率

第 i 行曝光 = 第 (i-1) 行曝光 - (第 i 行的分期付款 - 第 i 行的利息)

    installment interest   exposure

    0           0          1000
    100         0.005*1000 1000-(100-5)

兴趣取决于之前的曝光,曝光取决于最近的兴趣。这应该一直持续到曝光为 0。我已经使用 R 中的 for 循环完成了此操作。

有没有其他方法可以在没有循环的情况下做到这一点。我正在寻找一个快速的过程?

【问题讨论】:

  • 添加更多示例数据
  • 是的,向我们展示您的循环实现,然后人们就会知道您想要什么,并且可能会提出加速建议并能够针对原始版本进行测试。

标签: r loops for-loop


【解决方案1】:

这是循环版本,适合那些可能有兴趣解决这个问题的人:

n <- 10
# "pristine" starting data, in case you want to try other options.
df_start <- data_frame(
  installment = c(0, rep(100, n)),
  interest = c(0,rep(NA, n)),
  exposure = c(1000, rep(NA, n))
)


df1 <- df_start    
df1 <- within(df1,{
  for(i in 1:n) {
    interest[i + 1] <- exposure[i] * 0.005
    exposure[i + 1] <- exposure[i] - (installment[i + 1] - interest[i + 1])
  }
  rm(i)
})

我发现 R 在两种情况下需要循环。可能还有更多,但这些是我目前发现的:

  1. 当您对数据子集执行操作时,您需要动态决定该子集需要多大。

  2. 当您对两个或多个变量执行操作时,它们在行与行之间具有复杂的相互依赖关系。

这是第二种情况的示例 - 如果不知道第 n-1 行的曝光率,就无法确定对第 n 行的兴趣,您可以'在不知道第 n-1 行的兴趣的情况下确定第 n-1 行的曝光。换句话说,您确实需要前几行中的两个数据点才能获得数字行n

如果你真的需要速度,最好的办法是用编译语言对其进行编码,然后在 R 中创建一个调用编译函数的包装器——这就是 R 中矢量化的一般含义,而且这个特定的函数足够小,以至于用编译语言实现应该不会太难。

【讨论】:

  • 您好,谢谢。但我已经实现了与此非常相似的东西。我想知道是否有一种方法可以使用其他技术更快地做到这一点。
  • 正如 cmets 中的其他人所提到的,在考虑矢量化方面需要代码作为一个起点。我将它添加到我的答案中,以节省其他想要尝试找到非循环解决方案的人。正如我在下面解释的那样,我个人认为没有办法避免 R 中的循环。
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多