R迭代使用while循环和if语句
R Iteration using while loop and if statement
我是 R 的新手,我遇到以下问题:我需要解决一个数值优化问题,在该问题中我重新分配一个单位的劳动投入 (V20),从而增加整体生产率差异。我必须重复这个过程,直到它收敛。为此,优化后每行的生产率差异 (Diff20) 必须相等。
我的方法是计算最大和最小生产率差异(Diff_max,Diff_min)并从生产率差异最大的行移动一个单位的劳动投入(V20)Diff_max(表示生产率下降,因为一定水平的产出需要更多的劳动力投入)到生产率差异最小的行 Diff_min(表示生产率提高,因为需要较少的劳动力投入一定程度的产出)。
我尝试将 while 循环与 if 条件相结合,使该行成为 Diff_max 或 Diff_min。
不幸的是,这根本不起作用,所以我什至无法提供正确的错误消息。
你们中有人知道如何解决/处理这个问题吗?如果你能帮助我,那就太好了!非常感谢!
df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),"V19"=c(2.6,5.9,0.5,0.1,3.0),"V20"=c(2.1,7.2,0.3,0.2,2.3), "F19"=c(26,80,10,7,24), "F20"=c(28,90,3,5,13), "A19"=c(4,320,5,0,80), "A20"=c(2.7,458,0,0,45), "B19"=c(1,6,0,0,5), "B20"=c(2,5,0,0,3))
df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)
df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
df$Diff_mean <- mean(df$Diff20)
df$Diff_max <- max(df$Diff20)
df$Diff_min <- min(df$Diff20)
while (df$Diff_max> df$Diff_mean) {
if (df$Diff20 == df$Diff_max) {
df$V20 <- df$V20+0.1
}
if (df$Diff20 == df$Diff_min) {
df$V20 <- df$V20-0.1
}
}
正如 JKupzig 所指出的,循环中没有更新条件。
运行 我注意到另外两件事的代码:
- 通过增加最大值的提名者并减少最小值的提名者,它不会收敛。
- 在 0.1 时,grid-size 似乎太大而无法收敛,我把它变小了,所以最小的工作示例收敛了。
df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),
"V19"=c(2.6,5.9,0.5,0.1,3.0),
"V20"=c(2.1,7.2,0.3,0.2,2.3),
"F19"=c(26,80,10,7,24),
"F20"=c(28,90,3,5,13),
"A19"=c(4,320,5,0,80),
"A20"=c(2.7,458,0,0,45),
"B19"=c(1,6,0,0,5),
"B20"=c(2,5,0,0,3))
df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)
df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
# df$Diff_mean <- mean(df$Diff20)
# df$Diff_max <- max(df$Diff20)
# df$Diff_min <- min(df$Diff20)
df
while(round(max(df$Diff20),3) > round(mean(df$Diff20),3)){
df[df$Diff20 == max(df$Diff20), "V20"] <- df[df$Diff20 == max(df$Diff20), "V20"] - 0.00001
df[df$Diff20 == min(df$Diff20), "V20"] <- df[df$Diff20 == min(df$Diff20), "V20"] + 0.00001
df$num20 <- df$V20*220
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
}
df
我是 R 的新手,我遇到以下问题:我需要解决一个数值优化问题,在该问题中我重新分配一个单位的劳动投入 (V20),从而增加整体生产率差异。我必须重复这个过程,直到它收敛。为此,优化后每行的生产率差异 (Diff20) 必须相等。
我的方法是计算最大和最小生产率差异(Diff_max,Diff_min)并从生产率差异最大的行移动一个单位的劳动投入(V20)Diff_max(表示生产率下降,因为一定水平的产出需要更多的劳动力投入)到生产率差异最小的行 Diff_min(表示生产率提高,因为需要较少的劳动力投入一定程度的产出)。
我尝试将 while 循环与 if 条件相结合,使该行成为 Diff_max 或 Diff_min。
不幸的是,这根本不起作用,所以我什至无法提供正确的错误消息。
你们中有人知道如何解决/处理这个问题吗?如果你能帮助我,那就太好了!非常感谢!
df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),"V19"=c(2.6,5.9,0.5,0.1,3.0),"V20"=c(2.1,7.2,0.3,0.2,2.3), "F19"=c(26,80,10,7,24), "F20"=c(28,90,3,5,13), "A19"=c(4,320,5,0,80), "A20"=c(2.7,458,0,0,45), "B19"=c(1,6,0,0,5), "B20"=c(2,5,0,0,3))
df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)
df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
df$Diff_mean <- mean(df$Diff20)
df$Diff_max <- max(df$Diff20)
df$Diff_min <- min(df$Diff20)
while (df$Diff_max> df$Diff_mean) {
if (df$Diff20 == df$Diff_max) {
df$V20 <- df$V20+0.1
}
if (df$Diff20 == df$Diff_min) {
df$V20 <- df$V20-0.1
}
}
正如 JKupzig 所指出的,循环中没有更新条件。
运行 我注意到另外两件事的代码:
- 通过增加最大值的提名者并减少最小值的提名者,它不会收敛。
- 在 0.1 时,grid-size 似乎太大而无法收敛,我把它变小了,所以最小的工作示例收敛了。
df <- data.frame("PF"=c("PF1","PF2","PF3","PF4","PF5"),
"V19"=c(2.6,5.9,0.5,0.1,3.0),
"V20"=c(2.1,7.2,0.3,0.2,2.3),
"F19"=c(26,80,10,7,24),
"F20"=c(28,90,3,5,13),
"A19"=c(4,320,5,0,80),
"A20"=c(2.7,458,0,0,45),
"B19"=c(1,6,0,0,5),
"B20"=c(2,5,0,0,3))
df$num19 <- df$V19*220
df$denom19 <- (df$F19+df$A19+df$B19)
df$num20 <- df$V20*220
df$denom20 <- (df$F20+df$A20+df$B20)
df$rat19 <- df$num19/df$denom19
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
# df$Diff_mean <- mean(df$Diff20)
# df$Diff_max <- max(df$Diff20)
# df$Diff_min <- min(df$Diff20)
df
while(round(max(df$Diff20),3) > round(mean(df$Diff20),3)){
df[df$Diff20 == max(df$Diff20), "V20"] <- df[df$Diff20 == max(df$Diff20), "V20"] - 0.00001
df[df$Diff20 == min(df$Diff20), "V20"] <- df[df$Diff20 == min(df$Diff20), "V20"] + 0.00001
df$num20 <- df$V20*220
df$rat20 <- df$num20/df$denom20
df$Diff20 <- df$rat20 - df$rat19
}
df