在 R 中循环减法和追加

Loop Subtract and Append in R

我不完全确定这是什么类型的问题,但就是这样。

我有 2 个数据框(Baskets 和 Stocks Unwind)。我的问题要求我使用 Stocks unwind table 在篮子 table 中找到匹配的股票,并从可用的篮子中删除确切数量的单位。然后我需要 table 中的输出。我需要按日期顺序执行此操作的方式。让我以 APPL 为例。

我需要取出 100 单位的 AAPL。我需要从我的篮子库存中选择从哪里删除 AAPL 我的首要任务是从最早日期的篮子中取出。在循环过程之后,我会得到 2 tables。余数 table 以及无法移除的平仓 table 中的所有股票和篮子 Table 指示要平仓的篮子和顺序。在 AAPL 示例中,我的剩余股票 table 将包含 10 个单位的 APPL,而我的篮子 table 将打印 AAPL 的所有三个实例,因为它是 90(10+50+30)<100。请注意,我无法展开比我在 Unwind table 中拥有的股票更多的股票。

我非常确定存在这样的问题我只是不确定此类问题的名称或正确的标签。任何帮助将不胜感激

篮子table如下

BSKT | STOCK     | Nominal|  Date
-------------------------------
A    | AAPL       | 10    |  15/05/17
A    | V          | 25    |  15/05/17
B    | MFC        |  5    |  15/05/17
B    | GOOG       | 30    |  15/05/17
C    | AAPL       | 30    |  17/05/17
D    | AAPL       | 50    |  18/05/17

平仓股票 table 低于

STOCK | Units
--------------
AAPL | 100       
V    | 15        
GOOG | 20        
MFC  | 5       

结果 table 如下

放松的篮子

BSKT | STOCK     | Nominal|  Date
-------------------------------
A    | AAPL       | 10  |  15/05/17
A    | V          | 15  |  15/05/17
B    | MFC        |  5  |  15/05/17
B    | GOOG       | 20  |  15/05/17
C    | AAPL       | 30  |  17/05/17
D    | AAPL       | 50  |  18/05/17

还有待放松 Table

STOCK | Units
--------------
AAPL | 10      
V    | 0        
GOOG | 0        
MFC  | 0       

这是使用 dplyr 执行此操作的一种方法:

basket <- read.table(text="BSKT  STOCK      Units  Date
A     AAPL        10    15/05/17
A     V           25    15/05/17
B     MFC          5    15/05/17
B     GOOG        30    15/05/17
C     AAPL        30    17/05/17
D     AAPL        50    18/05/17",header=TRUE,stringsAsFactors=FALSE)

unwind <- read.table(text="STOCK  Units
AAPL  100
V     15
GOOG  20
MFC   5",header=TRUE,stringsAsFactors=FALSE)

library(dplyr)

updated_basket <- left_join(unwind,basket,by="STOCK") %>%
group_by(STOCK)  %>%
rowwise   %>%
mutate(to_trade=ifelse(Units.x<=Units.y,
                       Units.x,
                       min(Units.y,Units.x-cumsum(Units.y)))) %>%
ungroup %>%
group_by(STOCK)  %>%
mutate(left_to_trade=Units.x-cumsum(to_trade))

  STOCK Units.x  BSKT Units.y     Date to_trade left_to_trade
  <chr>   <int> <chr>   <int>    <chr>    <int>         <int>
1  AAPL     100     A      10 15/05/17       10            90
2  AAPL     100     C      30 17/05/17       30            60
3  AAPL     100     D      50 18/05/17       50            10
4     V      15     A      25 15/05/17       15             0
5  GOOG      20     B      30 15/05/17       20             0
6   MFC       5     B       5 15/05/17        5             0

updated_unwind <- updated_basket  %>%
ungroup %>%
group_by(STOCK)  %>%
summarise(Units=max(Units.x)-sum(to_trade))

  STOCK Units
  <chr> <int>
1  AAPL    10
2  GOOG     0
3   MFC     0
4     V     0