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