我有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循环完成了这项工作。
有没有其他方法可以在没有循环的情况下执行此操作。我正在寻找一个快速的过程吗?
答案 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需要在两种情况下循环。可能会有更多,但这些是我迄今为止所发现的:
当您对数据子集执行操作时,您需要动态决定子集需要的大小。
当您对两个或多个变量执行操作时,它们在行与行之间具有复杂的相互依赖关系。
这是第二种情况的一个例子 - 如果不知道 n -1行中的曝光,就无法确定行 n 的兴趣,你可以& #39; t确定行 n -1中的曝光,而不知道对行 n -1的兴趣。换句话说,您确实需要前一行中的两个数据点来获得一个数字行 n 。
如果你真的需要速度,最好的办法是用编译语言编写代码,然后在R中创建一个调用编译函数的包装器 - 这就是R中的矢量化通常意味着什么,而且这个特定的函数足够小,不应该用编译语言来实现它。