【问题标题】:R: Fastest way to do row wise computation on multiple columns of a data frameR:对数据帧的多列进行逐行计算的最快方法
【发布时间】:2013-04-17 13:08:44
【问题描述】:

我有一个数据框,我想在其中添加另一列,该列是涉及其他 3 列的计算结果。我现在使用的方法似乎很慢。有没有更好的方法来做同样的事情。这是我正在使用的方法。

library(bitops)

GetRes<-function(A, B, C){
  tagU <- bitShiftR((A*C), 4)
  tagV <- bitShiftR(B, 2)

  x<-tagU %% 2
  y<-tagV %% 4

  res<-(2*x + y) %% 4
  return(res)
}

df <- data.frame(id=letters[1:3],val0=1:3,val1=4:6,val2=7:9)
apply(df, 1, function(x) GetRes(x[2], x[3], x[4]))

我的数据框非常大,完成这个计算需要很长时间。有人可以建议我做得更好吗?

谢谢。

【问题讨论】:

    标签: r function dataframe apply


    【解决方案1】:

    试试mapply

    mapply(GetRes, df[,2], df[,3], df[,4])
    

    如果您告诉我们bitShiftR 来自哪个包,我们可以在更大的数据上对其进行测试,看看是否有任何性能提升。

    更新
    快速基准测试显示,mapply 的速度是 apply 的两倍

    microbenchmark(apply(df[,2:4], 1, function(x) GetRes(x[1], x[2], x[3])), mapply(GetRes, df[,2], df[,3], df[,4]))
    Unit: microseconds
                                                          expr     min       lq   median      uq      max neval
     apply(df[, 2:4], 1, function(x) GetRes(x[1], x[2], x[3])) 196.985 201.6200 206.7515 216.187 1006.775   100
                     mapply(GetRes, df[, 2], df[, 3], df[, 4])  99.982 105.6105 108.7560 112.232  149.311   100
    

    【讨论】:

    • 已添加。来自bitops
    • 如果 mapply 工作得更快,可能还值得使用它的并行版本:library(parallel) ; mcapply(GetRes, df[,2], df[,3], df[,4], mc.cores=xxx),其中 xxx 是您计算机中的内核数量。
    【解决方案2】:

    您所做的一切都已经矢量化,这比您提供的任何其他替代方案都要快得多。你可以这样称呼...

    with(df, GetRes(val0, val1, val2))
    

    或者这个

    GetRes(df$val0, df$val1, df$val2)
    

    或者这个

    GetRes(df[,2], df[,3], df[,4])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多