2017-07-31 48 views
2
累計總和

比方說,我們有兩個表:R,在反向

預算的表:

Item Budget 
A  900 
B  350 
C  100 
D  0 

bDT = structure(list(Item = c("A", "B", "C", "D"), Budget = c(900L, 
350L, 100L, 0L)), .Names = c("Item", "Budget"), row.names = c(NA, 
-4L), class = "data.frame") 

,並通過每個日期項的預計費用表。

Item  Date Expense 
    A 2017-08-24  850 
    B 2017-08-18  300 
    B 2017-08-11  50 
    C 2017-08-18  50 
    C 2017-08-11  100 
    D 2017-08-01  500 

expDF = structure(list(Item = c("A", "B", "B", "C", "C", "D"), Date = structure(c(17402, 
17396, 17389, 17396, 17389, 17379), class = "Date"), Expense = c(850L, 
300L, 50L, 50L, 100L, 500L)), .Names = c("Item", "Date", "Expense" 
), row.names = c(NA, -6L), class = "data.frame") 

我期待總結我們可以爲每個項目花費每日期這樣的量:

Item Date  Spend 
A  8/24/2017 850 
B  8/18/2017 300 
B  8/11/2017 50 
C  8/18/2017 50 
C  8/11/2017 50 
D  8/1/2017 0 
+0

Fyi,如果你使用'Date'類的列並且提供代碼很容易就可以再現這個例子,那麼每個人都會更好/更容易。有關指導,請參閱https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250。 – Frank

+2

我不明白這與累計求和有什麼關係。但我不明白結果如何產生的邏輯。爲什麼'D'0? – Gregor

+0

@Gregor這就像'預算 - cumsum(data.table :: shift(Expense,type =「lead」))',我猜,顯示在當前費用之前的預算金額。嗯,不,這兩種方法都不太合適,因爲兩個C都是50,好吧,我迷路了......也許是這樣,再加上'pmax'或'pmin'的地方。 – Frank

回答

1

這工作:

library(data.table) 
setDT(bDF); setDT(expDF) 

expDF[bDF, on=.(Item), Spending := 
    pmin(
    Expense, 
    pmax(
     0, 
     Budget - cumsum(shift(Expense, fill=0)) 
    ) 
) 
, by=.EACHI] 

    Item  Date Expense Spending 
1: A 2017-08-24  850  850 
2: B 2017-08-18  300  300 
3: B 2017-08-11  50  50 
4: C 2017-08-18  50  50 
5: C 2017-08-11  100  50 
6: D 2017-08-01  500  0 

它是如何工作

  • cumsum(shift(Expense, fill = 0))是現有開支**
  • MAX(0,預算 - 現有開支)的剩餘預算
  • 分鐘(費用,剩餘預算)是當前的開支

的data.table語法x[i, on=, j, by=.EACHI]是一個連接。在這種情況下,j的格式爲v := expr,它向x添加了一個新列。有關詳細信息,請參閱?data.table


**那麼,在表中排序「之前」。我會忽略OP的奇怪逆轉日期。

+0

非常好!在安裝data.table的同時在DataCamp中還發現了這些教程:[link](https://www.datacamp.com/courses/data-table-data-manipulation-r-tutorial) –

+0

@JDMarlin Yup,那個課程由data.table作者對於快速掌握軟件包非常有幫助。 – Frank