2017-08-28 85 views
0

我有一个列表TRADE,其中包含大量的data.frames。我需要对每个data.frames执行相同的数据操作。假设这个操作可以写成FUNCTION(initial.value, dataframe...)如何通过列表中的元素传递结果?

但我不能用apply()家庭,因为对贸易的功能使用的initial.amount [I + 1]是FUNCTIONTRADE[[i]]计算的final.amount。

我被告知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) 

单独data.frame资本从贸易计算的存储值:

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] 
} 

我们可以从这个循环看到final.amount从TRADE[[i]]将作为TRADE[[i+1]]的初始金额通过。但如何与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

你想要计算像'f(a [5],f(a [4]中,f([3]中,f(A [2]中,f(A [1],0))))))'? – Spacedman

+0

@Spacedman是的。有点像那样。计算的值,final.amount将用作第二个数据框中的initial.amount。然后从第二个数据帧计算出的final.amount将被用作第三个data.frame的initial.value。但除此之外,其他所有操作都是相同的。 –

+0

'Reduce'函数将继承列表的顺序处理的中间结果。 SO中有许多工作的例子。 ('sapply','vapply','mapply'和'lapply'不支持这个程序。) –

回答

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

相关问题