2012-03-05 64 views
6

最近我碰到了data.table包。 我还不确定如何进行行式矩阵操作。 最初是打算如何处理这种操作? 例如,什么data.table相当于apply(M,1,fun)R中的行明智矩阵操作

fun应该带一个向量作为参数,例如mean,medianmad

回答

4

我认为您正在寻找:=运营商(请参阅?':=')。一个简短的例子和与mapply函数的比较如下(我希望我正确地应用mapply函数;我现在只使用data.tables,所以没有承诺;但仍然,data.table方法是快速的并且在我的意见很容易记住):

library(data.table) 
> df <-  data.frame(ID = 1:1e6, 
+      B = rnorm(1e6), 
+      C = rnorm(1e6)) 
> system.time(x <- mapply(foo, df$B, df$C)) 
    user system elapsed 
    4.32 0.04 4.38 
> DT <- as.data.table(df) 
> system.time(DT[, D := foo(B, C)]) 
    user system elapsed 
    0.02 0.00 0.02 
> all.equal(x, DT[, D]) 
[1] TRUE 

张贴我的答案后,我不太确定了,如果这是你在找什么。我希望它能做到,只是给出更多细节(例如,你是否有许多列需要应用函数,而不仅仅是我的例子中的两个)。无论如何,这SO post可能是你感兴趣的。

+0

tmp < - DT [,D:= sum(B,C)]; tmp [1:2,] 给出了所有元素的总和。没有用的意思。 – 2012-03-05 12:24:31

+0

http://stackoverflow.com/questions/7885147/efficient-row-wise-operations-on-a-data-table没有推广到任何函数(均值)。 – 2012-03-05 12:31:16

+0

@ danas.zuokas:好点。在这些情况下,我想你只会使用'row ...'函数,例如'rowSums(DT [,list(B,C)])'',但我认为最好不要打开问题。 – 2012-03-05 12:46:39