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