2017-08-28 26 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的最後一個值,所以你可以刪除它,並將所有的一起綁定在一起

相關問題