R:循环执行命令以求解一个数值变量,该变量在每次迭代中都会增加,直到总和收敛到给定的整数

时间:2018-10-01 21:50:56

标签: r

我从未使用R来迭代求解数字。我用“直到”循环搜索了一个解决方案,但没有成功。也许可以通过类似于在Matlab中“解决”的方法来完成。

我有以下(简体)data.table

head(db)
    client_id Price Quantity Ai_SR
1: 0100003801 2.802      160 197.2983
2: 0100003802 2.802      142 178.1377
3: 0100003803 2.802      240 196.0487
4: 0100003804 2.802       75 175.2219
5: 0100003805 2.802      145 208.5448
6: 0100010401 2.802      159 362.6629

P_bar = 1开始,我要迭代以下命令:

sum(db[, (Ai_SR * P_bar^(-0.15)) * P_bar])

直到 sum(db[, (Ai_SR * P_bar^(-0.15)) * P_bar]) = 8493853224

我该如何编写一个通过在每次迭代中将P_bar增加0.01来实现此目的的命令?

此外,我敢肯定总和永远不会完全收敛到8493853224。因此,我认为我必须循环执行命令,直到总和严格大于8493853224为止,并简单地存储总和大于P_bar之前的最后一个8493853224

我想我可以复制并粘贴命令,并将P_bar替换为1,1.01,1.02,...,直到总和达到8493853224。有鸽友方法吗?

很抱歉,以前是否有人提出这个问题。为了辩护,我无法通过搜索类似循环的解决方案找到类似的东西。

谢谢!

2 个答案:

答案 0 :(得分:2)

calculation_max = 8493853224
step = 0.01
P_bar = 1 
while(calculation < calculation_max){
  calculation = sum(db[, Quantity * (P_bar^0.15)])
  P_bar = P_bar + step
}

答案 1 :(得分:2)

以编程方式进行描述的方式称为while循环,如djchapman's answer所示。但是,如果您想变得更“简单”(对于大问题更有效),则可以进行数学计算:

您的目标是找到一个P_bar,以使所有db$Ai_SR[i] * P_bar^(-0.15) * P_bar的总和等于特定常数(此处为8493853224)。将该常数设为 X 。然后

sum(db$Ai_SR * P_bar^(-0.15) * P_bar) = X 
sum(db$Ai_SR * P_bar^0.85) = X  
P_bar^0.85 * sum(db$Ai_SR) = X  
P_bar^0.85 = X / sum(db$Ai_SR)  
P_bar = (X / sum(db$Ai_SR))^(1/0.85)

虽然8493853224对于整个数据集来说可能是一个合理的数字,但对于您发布的六个观测值来说,它有点高。因此,让我们使用更合理的X = 5000例如:

## Read in the example data
db <- read.table(header = TRUE, text = "
 client_id Price Quantity Ai_SR
1: 0100003801 2.802      160 197.2983
2: 0100003802 2.802      142 178.1377
3: 0100003803 2.802      240 196.0487
4: 0100003804 2.802       75 175.2219
5: 0100003805 2.802      145 208.5448
6: 0100010401 2.802      159 362.6629")

## Apply the formula
(5000 / sum(db$Ai_SR))^(1/0.85)
# [1] 4.800361

## and check it against a naive while loop
P_bar <- 1
x <- sum(db$Ai_SR * (P_bar^0.85))
while ( x < 5000 ) {
  P_bar <- P_bar + 0.01
  x <- sum(db$Ai_SR * (P_bar^0.85))
}
P_bar
# [1] 4.81