Я хочу обновить средневзвешенные цены своих акций, как покупать и продавать их.
Я нашел частичное решение (хотя переполнение стека: Использование таблицы смещения и данных для обновления стоимости инвентаря ), но он не группируется по долям. Мои данные выглядят так:
library(data.table)
ledger <-data.table(
Share = c(rep("b",3), rep("x",2)),
Prc = c(10,20,15, 35,40),
Qty= c(300,-50,100, 50,-10),
Op =c("Purchase", "Sale", "Purchase", "Purchase", "Sale")
)
То, что я дошел до сих пор:
ledger<-ledger %>%group_by(Share)%>%
mutate(Stock = cumsum(Qty))%>%
group_by(Share)%>%
mutate(id =row_number())%>%
mutate(AvgPrice =ifelse( id ==1, Prc, NA_real_))
ledger<-as.data.table(ledger)
ledger[, Stock := cumsum(Qty)] # compute Stock value
ledger[, `:=` ( id = .I, AvgPrice = NA_real_ ) ] # add id and AvgPrice columns
ledger[ 1, AvgPrice := Prc] # compute AvgPrice for first row
# work with remaining rows and find the AvgPrice
ledger[ ledger[, .I[-1]], AvgPrice := {
if( Op == "Sale" ){
ledger[ .I-1, AvgPrice ]
} else {
round( ( ( Qty * Prc ) + ledger[ .I-1, AvgPrice * Stock ] ) /
( Qty + ledger[ .I-1, Stock]) ,
digits = 2 )
}
}, by = id ]
ledger[, id := NULL ] # remove id column
Проблема в том, что я хотел бы перезапустить, когда «Поделиться» изменится с b на x. Как и в случае с функцией group_by.
Я ценю любую помощь.