我有一个列表TRADE
,其中包含大量data.frames。我需要对每个data.frames执行相同的数据操作。假设这种操作可以用FUNCTION(initial.value, dataframe...)
编写。
但是我无法使用apply()
系列,因为FUNCTION在TRADE [[i + 1]]上使用的initial.amount是FUNCTION
在{{TRADE[[i]]
计算的final.amount。 1}}。
我被告知REDUCE()
函数可以通过列表传递中间结果。我阅读了几个相关的例子,但在我的案例中无法弄清楚如何使用。
下面提供了一个简化的例子。有人能提出一些建议吗?
ACLS <- data.frame( TICKER = c("ACLS", "ACLS", "ACLS"),
MIDQUOTE = c(11.05, 11.05, 11.05),
TradeSize = c(500, 153, 1247),
TradePrice = c(11.099, 11.080, 11.120) )
A <- data.frame( TICKER = c("A", "A", "A"),
MIDQUOTE = c(37.075, 37.075, 37.075),
TradeSize = c(100, 1000, 500),
TradePrice = c(36.75, 36.00, 37.49) )
AAPL <- data.frame( TICKER = c("AAPL", "AAPL", "AAPL"),
MIDQUOTE = c(23.56, 23.56, 23.56),
TradeSize = c(100, 100, 102),
TradePrice = c(23.600, 23.650, 23.650) )
TRADE <- list(ACLS, A, AAPL)
用于存储从TRADE计算的值的单独data.frame CAPITAL:
CAPITAL <- data.frame(matrix(nrow = length(TRADE), ncol = 5))
names(CAPITAL) <- c("intial.amount","buy.amount","sell.amount","profit", "final.amount")
CAPITAL[1,1] <- 30000
数据处理程序:
for(i in 1:length(TRADE)){
initial.amount <- CAPITAL[i,1]
buy.amount <- TRADE[[i]]$TradePrice[1]*TRADE[[i]]$TradeSize[1]
sell.amount <- TRADE[[i]]$TradePrice[3]*TRADE[[i]]$TradeSize[3]
profit <- sell.amount - buy.amount
final.amount <- initial.amount + profit
record <- c(buy.amount, sell.amount, profit, final.amount)
CAPITAL[i, 2:5] <- record
CAPITAL[i+1, 1] <- CAPITAL[i, 5]
}
我们可以从此循环中看到来自TRADE[[i]]
的final.amount将作为TRADE[[i+1]]
的initial.amount传递。但是如何使用REDUCE
或其他非循环函数执行此操作?
我需要的结果是结果final.amount
中的CAPITAL
列:
|initial.amount| buy.amount | sell.amount | profit | final.amount
|:-------------|------------:|:------------:|:-------|:--------
| 30000.00 | 5549.5 | 13866.64 | 8317.14| 38317.14
| 38317.14 | 3675.0 | 18745.00 |15070.00| 53387.14
| 53387.14 | 2630.0 | 2412.30 | 52.30| 53439.44
| 53439.44 | NA | NA | NA| NA
答案 0 :(得分:1)
这可能不是最优雅的方式,但它比循环
工作得更快buy.amount = sapply(TRADE, function(x) x[1,4]*x[1,3])
sell.amount = sapply(TRADE, function(x) x[3,4]*x[3,3])
profit = sell.amount-buy.amount
initial.amount = cumsum(c(30000,profit))
final.amount = initial.amount[-1]
在我的电脑中你的循环版本需要0.08秒,这需要0.041。对于最终矩阵,我认为你不需要initial.amount
的最后一个值,所以你可以删除它并将它们绑定在一起