2017-04-19 59 views
0

我不完全確定這是什麼類型的問題,但它在這裏。循環減去並追加在R

我有2個數據框(籃子和股票展開)。我的問題要求我使用庫存展開表來找到籃子表中的匹配庫存,並從籃子中刪除可用的確切數量的單位。然後我需要在表格中輸出。我需要按日期順序來做這件事。讓我以APPL爲例。

我需要刪除100單位的AAPL。我需要從我的籃子清單中進行選擇,從我的首要任務中移除AAPL的方法是從籃子中取出最早的日期。循環過程後,我會得到2個表。剩餘表格,包含Unwind表格中所有無法刪除的庫存以及Basket Table(籃子表格),指示從哪個籃子中退出並按哪個順序排列籃子。在AAPL示例中,我的剩餘庫存表中將包含10個APPL單位,而我的購物籃表將打印所有AAPL的三個實例,因爲它是90(10 + 50 + 30)< 100.請注意,我無法展開比我更多的庫存在放卷表中。

我很確定這樣的問題存在我只是不確定這種類型的問題或正確的標籤名稱。任何幫助,將理解

的籃桌被如下

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

@PLapointe更新和編輯感謝您的反饋。 – mannym

+1

對於GOOG,你需要放鬆20次,但是你的初始籃子裏有30個。爲什麼在最後放鬆時還需要放鬆10次? V. –

回答

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 
+0

@P Lapointe我有問題,解決方案的變種部分。發現我的列名在各個表中是不同的。 – mannym

+0

@P Lapointe會做 - 我只是在玩弄它,看看它是否適合我的數據。目前這不是因爲列名不一樣,我已經做了相應的調整。當我開始工作時,我會更新這兩個標籤以及您的答案。再次感謝所有幫助 – mannym

+0

@P Lapointe我在下面的錯誤mutate_impl(.data,dots)錯誤: 不相容的類型,期待一個整數向量 另外:警告消息: – mannym