2016-08-08 4 views
1

現在、列の値を特定の合計量だけ減らしてその量がゼロになるまで減らそうとしています。たとえば、このコードで作成されたデータフレームに: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 

私は、列に沿って走ると5000それぞれによってoverbuyの値を小さく、一度に5000によってBuyAmount列内の非ゼロ値を減らすためにしようとしています時間。ループを通る最初の実行後、DFはそうのようになります。overbuy 0に達するまで

>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の値は460000.に40000によって減少させるべきである私は、これらの値の上に実行し続けるために、このループをしたいと思います。

while(overbuy > 0){ 
    for(1 in 1:10){ 
    ifelse(df$BuyAmount[i] != 0, df$BuyAmount[i] <- df$BuyAmount[i] - 5000, "") 
    overbuy <- overbuy - 5000 
    } 
} 

任意の助けをいただければ幸いです。理論的には、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 

が一度overbuy 0.私の現在の試行がある達すると終わるだろう!

+0

if(df$BuyAmount[i] <= 0) next、見えますか?あなたのコードをよりエレガントにすることができる 'dplyr'の部分は間違いありませんが、大きな画像を理解するのに役立ちます。 –

+0

私は現在、各口座の購入金額を教えてくれるコードを持っていますが、通常、丸め誤差のために数千ドルオーバーシュートしています(各注文は$ 5000単位でしか置けません)。私は体系的にこのオーバーシュートを減らして、私が各口座で過剰買い上げをしてデビットに入れないようにしたい。上記の極端な例を使用して、ある値が0になると、それは残りの反復から除外されるべきであることを示しました。 – Nick

+0

5000で割り切れる数になるまで価格を下げるほうがより有用でしょうか?そうすれば、価値を上回らずに最も近い入札価格になります。 –

答えて

1

私はこれがうまくいくと思いますが、それはエレガントではなく、あなたの目標を完全に理解していないかもしれません。そうでない場合は、私に知らせてください、私はこれを修正します。

編集:あなただけの1行を必要なよう

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 
    } 
} 
+0

は、私は私が得る最後のDFは、あなたの期待出力とまったく同じではないこと。追加する行に移動しますしかし、私はこれがあなたの質問の論理に従っていると思うので、おそらくエラーはあなたの計算にありますか? – mkt

+0

これはスキップするのではなく0の要素を反復していると思いますが、確かに近いです。それは、10個の要素すべてに沿っているように見え、要素== 0で作業しているときに0または-5000の最大値を返します。これは、矛盾が生じる場所です。 – Nick

+0

あなたは正しい、私の間違い。編集されました。 – mkt

1

@mktは、あなたが行っている分析はどのような

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 
} 
関連する問題