2013-04-16 99 views
3

我有一個矩陣(origmatrix),我想在其上執行每列功能。我想把這個函數的結果放到另一個矩陣(newmatrix)中,該行的行號對應於原始矩陣中的列號。在真實數據集中,有20000行具有複雜的功能,所以我想使用一種應用程序以便能夠並行化項目。有沒有辦法讓我將數據從應用程序中獲取到newmatrix中?任何幫助將不勝感激!在R中的並行sapply中設置矩陣行中的值

origmatrix = matrix(1:50, 10, 5) 
colnames(origmatrix) = letters[1:5] 
newmatrix = matrix(0, 5,2) 
colnames(newmatrix) = c("Identifier","mean") 

boertje = function (x){ 
    newlist[which(colnames(origmatrix)==x),2]= mean(origmatrix[,x]) 
} 
sapply(colnames(origmatrix), boertje) 

回答

5

如何使用lapply多核版本,這是根據您的平臺parallel:::mclapplymulticore:::mclapply,然後又做了數據框出結果?你可以做一個數據幀,當你返回多個值,像這樣:

require(parallel) 
res <- mclapply(1:ncol(origmatrix) , mc.cores = 1 , function(x){ c(mean(origmatrix[,x]) , sd(origmatrix[,x]) , var(origmatrix[,x])) }) 

# So the first element of the resulting list looks like 
res[[1]] 
    # [1] 5.500000 3.027650 9.166667 

df <- as.data.frame(res) 
rownames(df) <- c("mean","sd","var") 
colnames(df) <- colnames(origmatrix) 
#    a   b   c   d   e 
# mean 5.500000 15.500000 25.500000 35.500000 45.500000 
# sd 3.027650 3.027650 3.027650 3.027650 3.027650 
# var 9.166667 9.166667 9.166667 9.166667 9.166667 

mclapply不來此警告在幫助頁面雖然...

警告
強烈勸阻在GUI或嵌入式環境中使用這些函數,因爲它會導致多個進程共享相同的GUI,這可能會導致混亂(可能會崩潰)。子進程不應該使用屏幕上的圖形設備。

+0

當我需要從我的函數返回1值時,這很好用。當我的函數返回3個值tho(在這種情況下,三明治包中的一個coeftest)時,我似乎無法使其工作。我嘗試過使用'newmatrix [,2:5] = unlist(...)',但這似乎也不起作用。 – Xizam

+0

@Xizam也許你可以更新這個問題來顯示你的函數中的值是如何返回的(3個值的列表?),我們可以從那裏拿走它?如果您有多個值,您是否希望每個值都顯示在單獨的列中?我不想猜測你的解決方案,所以如果你能明確說明返回值的結構會更好! :-) –

+0

@Xizam我已更新。編輯可能會解決你的問題? –