如果没有R中的for循环怎么做?

时间:2018-04-22 15:56:54

标签: r loops for-loop

我有3列:

  1. 兴趣
  2. 曝光
  3. 第一行就像这样

      installment interest exposure
    
        0          0        1000
    

    第一行的分期付款为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循环完成了这项工作。

    有没有其他方法可以在没有循环的情况下执行此操作。我正在寻找一个快速的过程吗?

1 个答案:

答案 0 :(得分:0)

这里是循环版本,对于那些可能有兴趣解决这个问题的人来说:

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. 当您对两个或多个变量执行操作时,它们在行与行之间具有复杂的相互依赖关系。

  3. 这是第二种情况的一个例子 - 如果不知道 n -1行中的曝光,就无法确定行 n 的兴趣,你可以& #39; t确定行 n -1中的曝光,而不知道对行 n -1的兴趣。换句话说,您确实需要前一行中的两个数据点来获得一个数字行 n

    如果你真的需要速度,最好的办法是用编译语言编写代码,然后在R中创建一个调用编译函数的包装器 - 这就是R中的矢量化通常意味着什么,而且这个特定的函数足够小,不应该用编译语言来实现它。