R:在数据帧的多个列上进行行方式计算的最快方法

Rac*_*wal 4 r function apply dataframe

我有一个数据框,我想添加另一列,这是一个涉及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]))
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Chi*_*til 7

尝试 mapply

mapply(GetRes, df[,2], df[,3], df[,4])
Run Code Online (Sandbox Code Playgroud)

如果您告诉我们哪个软件包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
Run Code Online (Sandbox Code Playgroud)

  • 如果“maply”工作得更快,那么也可能值得使用它的并行版本:“library(parallel)”;mcapply(GetRes, df[,2], df[,3], df[,4], mc.cores=xxx)`,其中“xxx”是计算机中的核心数量。 (2认同)