如何通过列表中的元素传递结果?

时间:2017-08-28 22:58:28

标签: r list reduce

我有一个列表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

1 个答案:

答案 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的最后一个值,所以你可以删除它并将它们绑定在一起