2013-10-17 61 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 
}