工作原理聚合使用FUN = diff

时间:2016-04-27 10:09:36

标签: r

我有以下数据框叫做'tbl'

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

我正在尝试这种代码,但它不起作用

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>

如何在diff内使用aggregate来解决问题,还是有其他办法?

1 个答案:

答案 0 :(得分:1)

使用lagabs而非diff的dplyr解决方案,但您获得的是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&#39; s:

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