r - 有效替代 for 循环分组数据以计算条件滚动最大值和最小值
问题描述
我在我的代码中使用以下 for 循环来获取数据表中值的最低上限和最高下限。
我的数据如下所示:
g1 g2 v1 RRP AVAILABLE FORSALE ACCEPT REJECT
A 1 -29 55 1 1 0 0
A 1 -28 45 1 0 0 1
A 1 -27 51 1 0 0 1
A 1 -26 50 1 1 1 0
A 1 -25 48 1 0 0 0
A 1 -24 37 1 1 1 0
A 1 -23 39 1 1 0 0
A 1 -22 35 1 0 0 1
A 1 -21 32 1 0 0 0
A 1 -20 45 1 1 0 0
A 1 -19 50 1 1 1 0
A 1 -18 44 0 1 0 0
这是我正在使用的 for 循环。我不确定如何提高此代码的性能,因为我想不出更好的方法来处理 HLM 和 LUM 的滚动值,这些值是计算表中下一个HLM和LUM的值所需的,对于每个组. 关于我的 for 循环设置中的数字31,每组中正好有31行数据。
for(i in 1:nrow(d1)/31){
HLM <- -1000
LUM <- 10000
for(j in 1:31){
x <- x+1
if(d1$AVAILABLE[x]){
d1$HLM[x] <- ifelse(!d1$ACCEPT[x]&!d1$FORSALE[x],max(d1$RRP[x],HLM),
min(d1$RRP[x],HLM))
HLM <- d1$HLM[x]
d1$LUM[x] <- ifelse(!d1$REJECT[x]&d1$FORSALE[x],min(d1$RRP[x],LUM),
max(d1$RRP[x],LUM))
LUM <- d1$LUM[x]
if(LUM < HLM & d1$ACCEPT[x]){
d1$HLM[x] <- d1$LUM[x]
HLM <- LUM
}
if(LUM < HLM & d1$REJECT[x]){
d1$LUM[x] <- d1$HLM[x]
LUM <- HLM
}
}
if(!d1$AVAILABLE[x]){
d1$HLM[x] <- -1000
d1$LUM[x] <- 10000
}
返回的值如下所示:
g1 g2 v1 RRP AVAILABLE FORSALE ACCEPT REJECT cMax cMin
A 1 -29 55 1 1 0 0 50 -1000
A 1 -28 45 1 0 0 1 50 45
A 1 -27 51 1 0 0 1 51 51
A 1 -26 50 1 1 1 0 50 50
A 1 -25 48 1 0 0 0 50 48
A 1 -24 37 1 1 1 0 37 37
A 1 -23 39 1 1 0 0 39 37
A 1 -22 35 1 0 0 1 39 35
A 1 -21 32 1 0 0 0 36 35
A 1 -20 45 1 1 0 0 45 35
A 1 -19 50 1 1 1 0 45 35
A 1 -18 44 0 1 0 0 44 35
我的代码逻辑是这样的:
- g1,g2是分组变量
- v1确定每组中的行顺序(升序)
- RRP是利息值
- AVAILABLE是一个条件变量。如果为 false,则将HLM和LUM设置为默认值
- FORSALE是一个条件变量,用于在 AVAILABLE 为真时计算 HLM 和 LUM。
- ACCEPT是一个条件变量,可以增加最低上边距的值,这可能需要相应调整HLM以使其永远不会大于LUM
- REJECT是一个条件变量,与ACCEPT具有类似的效果,除了HLM会改写LUM。
解决方案
推荐阅读
- java - Procrun 服务未在 Forground 中启动外部应用程序
- c# - 如何使用 MVVM 模式在 WPF 中动态创建带有图像的按钮
- html - 透明 iframe 背景
- jsp - 带有 JSP EL 的 pageContext 变量的空指针访问错误
- tensorflow - Python 中的错误:函数调用堆栈:train_function
- laravel - Laravel:以冗长的方式链接关系
- visual-studio-code - 突出显示映射到外部数据的代码行
- curl - 使用 curl 上传到 Dropbox 文件请求链接
- flutter - ByteArray 未按时写入磁盘
- mongodb - 为 MongoDB 使用 0.0.0.0/0 的风险