2016-04-27 58 views
-1

我已經叫下面的數據幀 'TBL'使用聚合FUN = DIFF

a 04/01/2016 9 
b 04/01/2016 14 
a 04/04/2016 11 
b 04/04/2016 15 
a 04/05/2016 14 
b 04/05/2016 20 

其中列分別稱爲Asset_TypeDateCumulative_P&L它是如何工作。

我需要與daily_P & L不累計輸出,即

<code> 
a 04/01/2016 0 
b 04/01/2016 0 
a 04/04/2016 2 
b 04/04/2016 1 
a 04/05/2016 3 
b 04/05/2016 5 

我正嘗試這樣的代碼,但它doesn't工作

tbl2 <- aggregate(Cumulative_P&L~Asset_Type+Date,tbl,FUN=function(x) diff(x,1)) 
tbl2 <- with(tbl,aggregate(Cumulative_P&L~Asset_Type+Date,FUN=function(x) diff(x,1))) </code> 

我如何在aggregate內部使用diff來解決這個問題,或者有其他方法嗎?

回答

1

一個dplyr解決方案使用lagabs而非diff,但你得到的NA值,而不是0

Asset_Type <- rep(c("a", "b"), 3) 
Date <- rep("4/01/2016", "4/04/2016", "4/05/2016", each = 2) 
Cumulative_PL <- c(9, 14, 11, 15, 14, 20) 
table <- data.frame(Asset_Type, 
        Date, 
        Cumulative_PL) 


table %>% 
    group_by(Asset_Type) %>% 
    mutate(Daily_PL = abs(Cumulative_PL - lag(Cumulative_PL))) 

結果:

 Asset_Type Date  Cumulative_PL Daily_diff 
     (fctr) (fctr)    (dbl)  (dbl) 
1   a  4/01/2016    9   NA 
2   b  4/01/2016   14   NA 
3   a  4/04/2016   11   2 
4   b  4/04/2016   15   1 
5   a  4/05/2016   14   3 
6   b  4/05/2016   20   5 

要轉換的NA值到0的:

table_df <- as.data.frame(table) 
table_df[is.na(table_df)] <- 0