【问题标题】:Row wise matrix operations in RR中的逐行矩阵运算
【发布时间】:2012-03-05 09:52:01
【问题描述】:

最近我遇到了data.table 包。 我仍然不确定如何进行逐行矩阵运算。 它最初是为了处理此类操作吗? 例如,什么是 data.table 相当于apply(M,1,fun)

fun 应该将向量作为参数,例如meanmedianmad

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为您正在寻找:= 运算符(请参阅?':=')。下面是一个简短的示例和与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 可能会让你感兴趣。

    【讨论】:

    • tmp
    • stackoverflow.com/questions/7885147/… 没有推广到任何函数(均值)。
    • @danas.zuokas:好点。在这些情况下,我猜你只会使用 row... 函数,例如rowSums(DT[, list(B, C)]),但我认为最好让问题保持开放。
    • @Danas 或者只是apply(DT,1,mad),就像你通常做的那样。那应该行得通。我们尽量避免行操作,但更喜欢列操作,以提高速度。例如,如果沿列是组名,我们倾向于将这些组作为键列(即 flat 又名 tall 格式)并执行DT[,mad(variable),by=group]。当您需要 wide 格式进行回归时,您可以 reshape 然后(或者数据已经从一些初步聚合步骤中变宽)。就像一个数据库。
    • 谢谢大家的提示。似乎对于行均值这样的非常基本的操作,rowMeans 最适合高矩阵。例如,我使用 rowMeans((data-centerM)^2) 样式来计算方差。
    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多