R - 来自多个数据帧的总和

时间:2018-01-27 04:01:22

标签: r dplyr aggregate

我试图看看R中是否有任何可用的功能/包可以更容易地执行以下操作。我在描述问题时请耐心等待。

我有一个交易清单,其中我将Funding_date和CCY_local的Trade_value_local(即交易总额)总和如下。

library(dplyr)
    > Sum_Trade_Amt_by_Funding_Date_Ccy <- combined_list  %>% select(Funding_date, CCY_local, Trade_value_local) %>%
    +   group_by(Funding_date, CCY_local) %>%
    +   summarise(Total = sum(Trade_value_local))
    > 
    > Sum_Trade_Amt_by_Funding_Date_Ccy
    # A tibble: 9 x 3
    # Groups: Funding_date [?]
      Funding_date CCY_local    Total
      <date>       <chr>        <dbl>
    1 2018-01-15   HKD         767200
    2 2018-01-15   KRW       - 115870
    3 2018-01-15   TWD         923639
    4 2018-01-16   HKD       - 113985
    5 2018-01-17   INR        2307592
    6 2018-01-17   MYR        3089969

I have a cash forecast of balances by local currencies and dates:

> cash_forecast_long = read.csv("cash_forecast_long.csv", header=TRUE, stringsAsFactors=FALSE)
> cash_forecast_long
   CCY_local       Day    Balance
1        AUD 1/10/2018   42984.41
2        HKD 1/10/2018  214412.85
3        INR 1/10/2018 1862292.95
4        KRW 1/10/2018      86.00
5        TWD 1/10/2018 2169925.00
6        USD 1/10/2018  873297.93
7        AUD 1/11/2018   32984.41
8        HKD 1/11/2018  214412.85
9        INR 1/11/2018 1862292.95
10       KRW 1/11/2018   20086.00
11       TWD 1/11/2018 5169925.00
12       USD 1/11/2018  573297.93

是否有优雅/更清洁的方式与R的现有功能/包一起构建(扩展)现金预测表,显示这些额外日期的现金余额?

说明: 对于有交易的货币和日期,例如 Dataframe,cash_forecast在01/11/2018(11月1日至18日)显示HKD余额214412.85。 Dataframe,Sum_Trade_Amt_by_Funding_Date_Ccy在2018 - 01 - 15(2018年1月15日)显示HKD总计767200。 2018年1月15日的港元余额将是1月11日至18日的余额和1月15日至18日的总和,此行项目将被添加到cash_forecast。

对于没有交易的货币和日期,例如 2018年1月15日,没有澳元交易,2018年1月15日的cash_forecast AUD将仅显示32984.41,这是2018年1月11日的相同余额,此行条目加入cash_forecast

示例输出:

enter image description here

1 个答案:

答案 0 :(得分:0)

我不清楚你在这里真正需要什么,因为你可以直接从你的现金预测表中得出每一天的交易而不参考任何其他表格,据我所知,这意味着你不要完全需要Sum_Trade_Amt_by_Funding_Date_Ccy表。由于每天结束时每种货币的余额只是期初余额加上任何交易金额,只要余额总是在变化,就可以操纵现金预测表的余额以获得交易。无论做什么交易都行。

使用您的现金预测表的示例输出版本(在下面的代码中缩写为cf的名称),交易可以作为派生表cf1导出如下,按货币类型和日期排序以显示交易的派生方式来自余额:

cf = arrange(cf, CCY_local, Day)
library(dplyr)    
cf1 = group_by(cf, CCY_local) %>%
  mutate(trade = Balance - lag(Balance)) %>%
  mutate(trade = ifelse(is.na(trade), 0, trade)) %>%
  select(CCY_local, Day, trade, Balance)

 > cf1
# A tibble: 18 x 4
# Groups:   CCY_local [6]
   CCY_local        Day    trade    Balance
       <chr>     <date>    <dbl>      <dbl>
 1       AUD 2018-01-10        0   42984.41
 2       AUD 2018-01-11   -10000   32984.41
 3       AUD 2018-01-15        0   32984.41
 4       HKD 2018-01-10        0  214412.85
 5       HKD 2018-01-11        0  214412.85
 6       HKD 2018-01-15   767200  981612.85
 7       INR 2018-01-10        0 1862292.95
 8       INR 2018-01-11        0 1862292.95
 9       INR 2018-01-15        0 1862292.95
10       KRW 2018-01-10        0      86.00
11       KRW 2018-01-11    20000   20086.00
12       KRW 2018-01-15  -115870  -95784.00
13       TWD 2018-01-10        0 2169925.00
14       TWD 2018-01-11  3000000 5169925.00
15       TWD 2018-01-15 -2076361 3093564.00
16       USD 2018-01-10        0  873297.93
17       USD 2018-01-11  -300000  573297.93
18       USD 2018-01-15        0  573297.93

为了表明这确实派生了你的sum_trade_amt表,我们可以过滤结果以仅显示交易,并按日期排列:

cf2 = filter(cf1, trade != 0) %>%
  select(Day, CCY_local, trade) %>%
  arrange(Day, CCY_local)

> cf2
# A tibble: 7 x 3
# Groups:   CCY_local [5]
         Day CCY_local    trade
      <date>     <chr>    <dbl>
1 2018-01-11       AUD   -10000
2 2018-01-11       KRW    20000
3 2018-01-11       TWD  3000000
4 2018-01-11       USD  -300000
5 2018-01-15       HKD   767200
6 2018-01-15       KRW  -115870
7 2018-01-15       TWD -2076361

在问题中提供的有限数据中,显然交易的金额并非在所有情况下都与您在Excel屏幕截图中显示的金额相匹配。例如,您显示15-01-2018 TWD交易923639,但这与您在11/1/2018的5169925的余额不符合15/1/2018的3093564,负值为-2076361,如cf2所示上表。

数据设置

cf = read.table(text = "CCY_local Day Balance
AUD 1/10/2018 42984.41
HKD 1/10/2018 214412.85
INR 1/10/2018 1862292.95
KRW 1/10/2018 86.00
TWD 1/10/2018 2169925.00
USD 1/10/2018 873297.93
AUD 1/11/2018 32984.41
HKD 1/11/2018 214412.85
INR 1/11/2018 1862292.95
KRW 1/11/2018 20086.00
TWD 1/11/2018 5169925.00
USD 1/11/2018 573297.93
AUD 1/15/2018 32984.41
HKD 1/15/2018 981612.85
INR 1/15/2018 1862292.95
KRW 1/15/2018 -95784.00
TWD 1/15/2018 3093564.00
USD 1/15/2018 573297.93", header = TRUE, stringsAsFactors = FALSE)

cf$Day = as.Date(cf$Day, "%m/%d/%Y")