2016-08-07 22 views
0

我在列表中有數字data.frame對象,並且想要並行添加它們。不過,我觀察到,在網格中添加配對的data.frame對象是重複的,我只能遍歷網格的上/下三角並對它們進行平行求和。我爲此編寫了簡單的R函數,但是由於重複求和,我的輸出位效率較低。我敢打賭,做這份工作必須有更直觀/更高效的方式。有沒有人有更好的解決方案,當data.frame對象在網格中時更容易/有效地做到這一點?任何建議,以更好地制定我的這項任務的功能?感謝如何高效地迭代網格中的data.frame對象?

模擬數據

fo <- data.frame(start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)) 
ba <- data.frame(start=seq(5, by=2, len=7), stop=seq(7, by=2, len=7)) 
bleh <- data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5)) 

mylist <- list(fo, ba, bleh) 

我的自定義功能

add_pairDF <- function(set, idx=1L) { 
    quer <- set[[idx]] 
    .quer <- mapply('+', quer, quer) 
    supp <- lapply(set[-idx], function(ele_) { 
    ans <- mapply('+', quer, ele_) 
    }) 
    res <- c(list(.quer), supp) 
    return(res) 
} 

初始輸出(重複存在):

ans_1 <- add_pairDF(set=mylist, idx=1L) 
ans_2 <- add_pairDF(set=mylist, idx=2L) 
ans_3 <- add_pairDF(set=mylist, idx=3L) 

期望的輸出:

以我的初始輸出, FUNC重刑確實總結配對data.frame對象,但我認爲我不需要三次用mylist的不同索引打我的函數。

我想刪除配對的data.frame上的重複求和,如果所有配對的data.frame對象都放置在網格中,我們的目標是走在下/上三角形(包括對角線)上。我怎樣才能避免這種重複?網格中data.frame對象的有效迭代是什麼?任何人都可以提出可能的想法來解決我的問題嗎?

+0

按原樣運行代碼會產生警告,因爲數據幀的長度不同。你能發佈你期望的實際數字輸出並解釋這個計算的目的嗎? –

+0

您可以暫時忽略警告。如果像我在帖子中顯示的那樣運行我的自定義函數三次,它將以網格模式運行,因爲發生重複的總和,所以不希望這樣做。我正在尋求更有效的迭代,只能在網格的上/下三角形(包括對角線)上行走。有什麼更好的想法 – Jeff

回答

1

下面是一個方法。

add_df <- function(df1, df2) { 
    mapply("+", df1, df2) 
} 

# Get all pairs of indices 
ndf <- length(mylist) 
idx <- expand.grid(1:ndf, 1:ndf) 
idx <- idx[idx[,1] <= idx[,2],] 

Map(function(i, j) add_df(mylist[[i]], mylist[[j]]), idx[,1], idx[,2]) 

我不確定添加具有不同行數的數據幀的意圖是什麼。但是,假設你想要的答案,只添加這兩個數據幀具有共同的行,你可以替換add_df有:

add_df <- function(df1, df2) { 
    nr <- min(nrow(df1), nrow(df2)) 
    df1[1:nr,] + df2[1:nr,] 
} 

編輯:我換成mapplyMap,以確保結果是一個列表後一種情況。

+0

謝謝。它對我很好。 – Jeff