我从未使用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
。有鸽友方法吗?
很抱歉,以前是否有人提出这个问题。为了辩护,我无法通过搜索类似循环的解决方案找到类似的东西。
谢谢!
答案 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