- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力避免在 R 中使用 for 循环以加快计算和简化,尽可能地依赖向量函数。到目前为止,我已经成功了,直到遇到某些摊销计算。我碰壁了,不得不求助于 for 循环,请参阅下面的 MWE 代码。它工作正常,但我想用 vector 或其他更高效的函数替换它。有人可以帮我用向量函数替换下面的内容吗?
在从中提取此 MWE 的完整代码中,它使用 Shiny 进行响应。周期和向量速率,实际上是所有变量,都会根据用户输入发生剧烈变化。 MWE 示例输入变量已简化。
无论如何,以下是一种非常笨拙的电锯方法,需要精简。但是我不知道如何从我最有经验的完整 XLS 思维方式来处理这个问题。如果 for 循环是此类计算的唯一可行选择,我欢迎提出任何改进以下 MWE 的建议。
最底部是用于“矢量化”的有缺陷尝试的代码,但当矢量变量随时间变化时结果不准确。我在底部的图像中展示了这种矢量化方法的一个问题,当从一个时期移动到下一个时期时,期末/期初余额不匹配(for-loop MWE 代码没有这些问题 - 它是功能性的但 super 笨拙)。
For 循环 MWE 代码:
periods <- 10
beginBal <- 1000
yield_vector <- c(0.30,0.30,0.30,0.30,0.30,0.28,0.26,0.20,0.18,0.20)
npr_vector <- c(0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30)
mpr_vector <- c(0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20)
default_vector <- c(0.10,0.10,0.10,0.10,0.10,0.09,0.08,0.07,0.06,0.05)
amort <- data.frame(period=seq(1,periods,1),
beginBal=rep(NA,periods),
yield=rep(NA,periods,),
purchases=rep(NA,periods),
payments=rep(NA,periods),
defaults=rep(NA,periods),
endBal=rep(NA,periods))
# Completes first row of data frame
amort[1,2] <- beginBal
amort[1,3] <- beginBal * yield_vector[1]/12
amort[1,4] <- beginBal * npr_vector[1]
amort[1,5] <- beginBal * mpr_vector[1]
amort[1,6] <- beginBal * default_vector[1] / 12
amort[1,7] <- beginBal + amort[1,4] - amort[1,5] - amort[1,6]
# Completes remaining rows of data frame
for(i in 2:nrow(amort)){
amort[i,2] <- amort[i-1,7]
amort[i,3] <- amort[i,2] * yield_vector[i]/12
amort[i,4] <- amort[i,2] * npr_vector[i]
amort[i,5] <- amort[i,2] * mpr_vector[i]
amort[i,6] <- amort[i,2] * default_vector[i]/12
amort[i,7] <- amort[i,2] + amort[i,4] - amort[i,5] - amort[i,6]
}
amort
这是一个看起来很漂亮但有缺陷的矢量化尝试,请参见下图中的输出缺陷之一(这些问题不会出现在上面的 for 循环 MWE 中):
amort <- data.frame(period=seq(1,periods,1))
amort$beginBal <- beginBal*(1-(mpr_vector[]+default_vector[]/12-npr_vector[]))^(amort$period-1)
amort$yield <- amort$beginBal*yield_vector[]/12
amort$purchases <- amort$beginBal*npr_vector[]
amort$payments <- amort$beginBal*mpr_vector[]
amort$defaults <- amort$beginBal*default_vector[]/12
amort$endBal <- amort$beginBal+amort$purchases-amort$payments-amort$defaults
amort <- cbind(amort,yield_vector,npr_vector,mpr_vector,default_vector)
amort
最佳答案
你可以这样做:
f <- function(x, y){
x * (1 + npr_vector[y] - mpr_vector[y] - default_vector[y] / 12)
}
res <- Reduce(f, seq(periods), init = beginBal, accumulate = TRUE)
b <- head(res, -1)
result <- data.frame(period = seq(periods), beginBal = b, yield = b * yield_vector/ 12,
purchases = b * npr_vector, payments = b * mpr_vector,
defaults = b * default_vector/12, endBal = res[-1])
检查:
result
period beginBal yield purchases payments defaults endBal
1 1 1000.000 25.00000 300.0000 200.0000 8.333333 1091.667
2 2 1091.667 27.29167 327.5000 218.3333 9.097222 1191.736
3 3 1191.736 29.79340 357.5208 238.3472 9.931134 1300.979
4 4 1300.979 32.52446 390.2936 260.1957 10.841488 1420.235
5 5 1420.235 35.50587 426.0705 284.0470 11.835291 1550.423
6 6 1550.423 36.17654 465.1269 310.0846 11.628174 1693.837
7 7 1693.837 36.69981 508.1512 338.7675 11.292249 1851.929
8 8 1851.929 30.86548 555.5786 370.3858 10.802918 2026.319
9 9 2026.319 30.39478 607.8956 405.2637 10.131594 2218.819
10 10 2218.819 36.98032 665.6457 443.7638 9.245079 2431.456
all.equal(result, amort)
[1] TRUE
关于r - 如何在数据帧计算中用矢量函数替换 R 中的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68398411/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!