2013-10-17 101 views
0

我有這樣一些功能:與轉置數據處理中的R

myf = function(x) { 
    # many similar statements involving indexing x 
    do1(x[, indexfunc1()]) 
    do2(x[, indexfunc1()]) 
    do3(x[, indexfunc1()]) 
    do4(x[, indexfunc1()]) 
    do5(x[, indexfunc1()]) 
} 

在所有這些功能,我需要提取的列或行的x ,而這些功能在一些循環使用。 問題是我們有時候也有數據換位的 格式,所以這意味着對於這些數據我們必須得到t(x)。 由於 這些矩陣通常很大,所以這是非常無效和非常耗時的。

有沒有一個聰明的方法來處理這個問題?這將是非常煩人的 必須手動更改代碼。

+0

不能你剛剛解決它適用()函數!?所以如果其轉置用途適用於行/列取決於你的數據! – alap

+1

如果調用't'是分析過程中的緩慢部分,我會感到非常滿意。你有沒有做過任何性能分析? –

+0

@RichieCotton轉置整個矩陣需要2秒鐘的時間。想象一下在for循環中這樣做!有時我們還會使用bigmemory軟件包將數據存儲在硬盤上,在這種情況下,根本無法進行轉置。 – qed

回答

1

嗯,首先,如果你的doX功能預計矩陣的轉置,你會在某個地方打電話t,例如

do1(t(x[indexfunc(),]))) 

那麼你的選擇是:

  1. 轉置x一次在頂部
  2. 轉置在每個doX調用
  3. 重寫doX函數,以便它們採用可選的isTranspose參數。

選項3將是最多的工作,但也是最有效的。使用選項2的情況是有意義的,如果x是巨大的,但是每次只選擇少量的行/列。在這種情況下,你可以做這樣的事情:

matrixSelect<-function(x,subset,dim=1){ 
    if(dim==1) 
     t(x[subset,]) 
    else 
     x[,subset] 
} 

,然後寫

myf = function(x,dim=2) { 
    # many similar statements involving indexing x 
    do1(matrixSelect(x,indexfunc1(),dim) 
    # etc 
}