依次减少 R 中列中的值
Sequentially reduce values in a column in R
我目前正在尝试将列中的值减少一定的总量,直到该数量达到零。例如,在此代码创建的数据框中:
df = data.frame(matrix(0,nrow=10,ncol=2))
colnames(df) <- c("AccountNumber", "BuyAmount")
overbuy <- 500000
df$AccountNumber <- seq(1:10)
df$BuyAmount <- c(35000, 220000, 240000, 0, 195000, 55000, 0, 280000, 65000, 105000)
>df
AccountNumber BuyAmount
1 1 35000
2 2 220000
3 3 240000
4 4 0
5 5 195000
6 6 50000
7 7 0
8 8 280000
9 9 65000
10 10 105000
我试图将 BuyAmount 列中的非零值一次减少 5000,运行沿着该列并每次将超买的值减少 5000。在第一个 运行 循环之后,df 应该如下所示:
>df
AccountNumber BuyAmount
1 1 30000
2 2 215000
3 3 235000
4 4 0
5 5 190000
6 6 45000
7 7 0
8 8 275000
9 9 60000
10 10 100000
并且超买的值应该减少 40000 到 460000。我希望这个循环继续 运行 这些值直到超买达到 0。理论上,df 将结束为
>df
AccountNumber BuyAmount
1 1 0
2 2 150000
3 3 170000
4 4 0
5 5 130000
6 6 0
7 7 0
8 8 210000
9 9 0
10 10 35000
一旦超买达到 0。我目前的尝试是:
while(overbuy > 0){
for(1 in 1:10){
ifelse(df$BuyAmount[i] != 0, df$BuyAmount[i] <- df$BuyAmount[i] - 5000, "")
overbuy <- overbuy - 5000
}
}
如有任何帮助,我们将不胜感激!
我认为这可行,但不够优雅,而且我可能没有完全理解您的目标。如果没有,请告诉我,我会解决这个问题。
已编辑:
while(overbuy > 0){
for(i in 1:10){
if(df$BuyAmount[i]!=0){
overbuy <- overbuy - 5000
}
df$BuyAmount[i] <- pmax(0, df$BuyAmount[i] - 5000)
print(overbuy)
print(df)
if(overbuy == 0) break
}
}
@mkt 看起来你只需要一行,if(df$BuyAmount[i] <= 0) next
while(overbuy > 0){
for(i in 1:10){
if(df$BuyAmount[i] <= 0) next
df$BuyAmount[i] <- pmax(0, df$BuyAmount[i] - 5000)
overbuy <- overbuy - 5000
print(overbuy)
print(df)
if(overbuy == 0) break
}
if(overbuy == 0) break
}
我目前正在尝试将列中的值减少一定的总量,直到该数量达到零。例如,在此代码创建的数据框中:
df = data.frame(matrix(0,nrow=10,ncol=2))
colnames(df) <- c("AccountNumber", "BuyAmount")
overbuy <- 500000
df$AccountNumber <- seq(1:10)
df$BuyAmount <- c(35000, 220000, 240000, 0, 195000, 55000, 0, 280000, 65000, 105000)
>df
AccountNumber BuyAmount
1 1 35000
2 2 220000
3 3 240000
4 4 0
5 5 195000
6 6 50000
7 7 0
8 8 280000
9 9 65000
10 10 105000
我试图将 BuyAmount 列中的非零值一次减少 5000,运行沿着该列并每次将超买的值减少 5000。在第一个 运行 循环之后,df 应该如下所示:
>df
AccountNumber BuyAmount
1 1 30000
2 2 215000
3 3 235000
4 4 0
5 5 190000
6 6 45000
7 7 0
8 8 275000
9 9 60000
10 10 100000
并且超买的值应该减少 40000 到 460000。我希望这个循环继续 运行 这些值直到超买达到 0。理论上,df 将结束为
>df
AccountNumber BuyAmount
1 1 0
2 2 150000
3 3 170000
4 4 0
5 5 130000
6 6 0
7 7 0
8 8 210000
9 9 0
10 10 35000
一旦超买达到 0。我目前的尝试是:
while(overbuy > 0){
for(1 in 1:10){
ifelse(df$BuyAmount[i] != 0, df$BuyAmount[i] <- df$BuyAmount[i] - 5000, "")
overbuy <- overbuy - 5000
}
}
如有任何帮助,我们将不胜感激!
我认为这可行,但不够优雅,而且我可能没有完全理解您的目标。如果没有,请告诉我,我会解决这个问题。
已编辑:
while(overbuy > 0){
for(i in 1:10){
if(df$BuyAmount[i]!=0){
overbuy <- overbuy - 5000
}
df$BuyAmount[i] <- pmax(0, df$BuyAmount[i] - 5000)
print(overbuy)
print(df)
if(overbuy == 0) break
}
}
@mkt 看起来你只需要一行,if(df$BuyAmount[i] <= 0) next
while(overbuy > 0){
for(i in 1:10){
if(df$BuyAmount[i] <= 0) next
df$BuyAmount[i] <- pmax(0, df$BuyAmount[i] - 5000)
overbuy <- overbuy - 5000
print(overbuy)
print(df)
if(overbuy == 0) break
}
if(overbuy == 0) break
}