Последовательно уменьшайте значения в столбце в 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

И значение overbuy должно быть уменьшено на 40000 до 460000. Я хотел бы, чтобы этот цикл продолжал работать над этими значениями, пока overbuy не достигнет 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
  }
}

Любая помощь будет оценена!

2 ответа

Решение

Я думаю, что это работает, но это не элегантно, и я, возможно, не полностью понял вашу цель. Если нет, дайте мне знать, и я исправлю это.

Редакция:

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
}
Другие вопросы по тегам