我不完全确定这是什么类型的问题,但在这里。
我有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
答案 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