循环减去并附加在R中

时间:2017-04-19 12:23:07

标签: r loops dplyr subtraction

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

我有2个数据框(Baskets和Stocks Unwind)。我的问题要求我使用Stocks展开表在篮子表中找到匹配的库存,并从可用的篮子中删除确切的单位数。然后我需要表中的输出。按照日期顺序我需要这样做的方式。让我用APPL作为例子。

我需要删除100个单位的AAPL。我需要从我的篮子库存中选择从我的第一个优先事项中删除AAPL的地方是从最早的日期获取篮子。循环过程后,我会得到2个表。一张剩余表,其中包含Unwind表中无法删除的所有库存,以及篮子表,指示要从哪个篮子展开以及以哪种顺序展开。在AAPL示例中,我的余数库存表中将包含10个APPL单位,而我的购物篮表将打印所有三个AAPL实例,因为它是90(10 + 50 + 30)<100。请注意,我无法展开比Unwind表中更多的库存。

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

篮子表如下

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

待放松股票的价格低于

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

结果表如下

放松的篮子

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

剩余展开表

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

1 个答案:

答案 0 :(得分: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