循环R中的减法和追加

循环R中的减法和追加,r,loops,dplyr,subtraction,R,Loops,Dplyr,Subtraction,我不完全确定这是什么类型的问题,但问题就在这里 我有2个数据帧(篮子和股票平仓)。我的问题要求我使用Stocks unwind表在basket表中找到匹配的股票,并从可用的basket中删除确切数量的单位。然后我需要一个表中的输出。我需要按照日期顺序来做这件事。让我以APPL为例 我需要移除100个AAPL单元。我需要从我的篮子清单中选择从哪里移除AAPL,我的首要任务是从最早日期的篮子中取出。在循环过程之后,我会得到两张表。一个剩余表,其中包含放卷表中无法移除的所有库存,以及指示从哪个篮子中放

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

我有2个数据帧(篮子和股票平仓)。我的问题要求我使用Stocks unwind表在basket表中找到匹配的股票,并从可用的basket中删除确切数量的单位。然后我需要一个表中的输出。我需要按照日期顺序来做这件事。让我以APPL为例


我需要移除100个AAPL单元。我需要从我的篮子清单中选择从哪里移除AAPL,我的首要任务是从最早日期的篮子中取出。在循环过程之后,我会得到两张表。一个剩余表,其中包含放卷表中无法移除的所有库存,以及指示从哪个篮子中放卷以及按哪个顺序放卷的篮子表。在AAPL示例中,我的剩余库存表中有10个单位的APPL,我的篮子表将打印AAPL的所有三个实例,因为它是90(10+50+30)使用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
basket%
变异(到交易=ifelse(单位x%)
解组%>%
集团(股票)%>%
变异(左至右交易=单位.x-cumsum(至右交易))
库存单位.x BSKT单位.y交易日期左
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
已更新\u展开%
解组%>%
集团(股票)%>%
汇总(单位=最大(单位x)-总计(至交易))
库存单位
1 AAPL 10
2 GOOG 0
3MFC0
4V0

请根据您提供的表格填写所需结果。此外,还有“库存”底部的表与您所指的放松表相同?@PLapointe已更新并编辑,感谢您的反馈。对于GOOG,您需要放松20次,但您的初始篮子中有30次。为什么在最后的放松中您仍然需要放松10次?与V相同的评论。@PLapointe很抱歉弄错了您是对的,我已更新accor而且还更新了表格,让他们做得更多一些sese@PLapointe我在解决方案的变异部分遇到了问题。结果表明,我的列名在不同的表中是不同的。@P Lapointe可以-我只是在玩弄它,看看它是否能正确处理我的数据。目前不是因为列名不正确同样的,我已经相应地调整了。我会在我开始工作时更新这两个标签以及你的答案。再次感谢所有的帮助help@P我在mutate_impl(.data,dots)中得到以下错误:不兼容的类型,除此之外还需要一个整数向量:警告消息:@mannym在不查看数据的情况下很难说。请确保该类与我使用
str(basket)
str(unwind)的示例中的类相同
@P Lapointe我计划更新我的问题,使其更详细,因为您提供的解决方案适用于上面的小数据集,但在我的大数据集上运行时会提供矛盾的输出。更新问题后,我是否应取消选中已回答的图标?抱歉,我是新手
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       
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