2017-05-16 14 views
1

行の結果が次の行への入力である場合、いくつかの計算を実行します。dplyrの前の行の結果に基づいて計算する方法

私はかなり遅いループのため使用しています、私はこれらのタイプの計算のためにdplyr使用できる方法はありますか?

df <- data.frame(beginning_on_hand = c(10,0,0,0,0,0,0,0,0,0,0,0), 
        sales = c(10,9,4,7,3,7,2,6,1,5,7,1), 
        ship = c(10,9,4,7,3,7,2,6,1,5,7,1)) 

dfb <- df %>% 
     mutate(receipts = 0) %>% 
     mutate(ending_on_hand = 0) %>% 
     mutate(receipts = lag(ship, 2)) %>% 
     mutate(receipts = if_else(is.na(receipts), 0, receipts)) 

> dfb 
    beginning_on_hand sales ship receipts ending_on_hand 
       10 10 10  0    0 
        0  9 9  0    0 
        0  4 4  10    0 
        0  7 7  9    0 
        0  3 3  4    0 
        0  7 7  7    0 
        0  2 2  3    0 
        0  6 6  7    0 
        0  1 1  2    0 
        0  5 5  6    0 
        0  7 7  1    0 
        0  1 1  5    0 

for(i in 1:(nrow(dfb)- 2)) { 
    dfb$ending_on_hand[i] <- dfb$beginning_on_hand[i] + dfb$receipts[i] - dfb$sales[i] 
    dfb$beginning_on_hand[i+1] <- dfb$ending_on_hand[i] 
} 

> dfb 
    beginning_on_hand sales ship receipts ending_on_hand 
1     10 10 10  0    0 
2     0  9 9  0    -9 
3     -9  4 4  10    -3 
4     -3  7 7  9    -1 
5     -1  3 3  4    0 
6     0  7 7  7    0 
7     0  2 2  3    1 
8     1  6 6  7    2 
9     2  1 1  2    3 
10     3  5 5  6    4 
11     4  7 7  1    0 
12     0  1 1  5    0 
+1

dplyr 'を見てください::ラグを()' – Phil

+0

がすると仮定レシート-2と2の終了にあなたの最後の2行ですか? '4 + 1-7 = -2'および' -2 + 5-1 = 2' – akash87

答えて

0

次の例では、私は、このためdplyrソリューションを持っているが、ここでは、このためのソリューションですdata.tableません。説明する

df <- data.frame(beginning_on_hand = c(10,0,0,0,0,0,0,0,0,0,0,0), 
       sales = c(10,9,4,7,3,7,2,6,1,5,7,1), 
       ship = c(10,9,4,7,3,7,2,6,1,5,7,1)) 

dfb <- df %>% 
    mutate(ending_on_hand = 0) %>% 
    mutate(receipts = lag(ship, 2)) %>% 
    mutate(receipts = if_else(is.na(receipts), 0, receipts)) 

dfb<-data.table(dfb) 
df.end <- dfb[, ending_on_hand := cumsum(beginning_on_hand + receipts - sales)][, 
       beginning_on_hand := beginning_on_hand + lag(ending_on_hand, default = 0)] 

>df.end 
    beginning_on_hand sales ship ending_on_hand receipts 
1:    10 10 10    0  0 
2:     0  9 9    -9  0 
3:    -9  4 4    -3  10 
4:    -3  7 7    -1  9 
5:    -1  3 3    0  4 
6:     0  7 7    0  7 
7:     0  2 2    1  3 
8:     1  6 6    2  7 
9:     2  1 1    3  2 
10:     3  5 5    4  6 
11:     4  7 7    -2  1 
12:    -2  1 1    2  5 

data.tableは、基本的にデータを含むようにリストし、典型的には、フラットファイルのように表示を使用します。 SQL型命令を使用してデータを整理し、処理します。ここで使用されるノートの機能は、cumsumlagです。 cumsumは、特定のインデックスより前のすべての値を計算し、lagは、指定されたインデックスよりも前または前の値を探します。

関連する問題