我有一个数据框,我想添加另一列,这是一个涉及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]))
我的数据框架很大,需要很长时间才能完成这项计算。有人可以建议我做得更好吗?
感谢。
答案 0 :(得分:7)
尝试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
答案 1 :(得分:3)
您所做的一切都已经过矢量化,这比您提供的任何其他替代品要快得多。你可以称之为......
with(df, GetRes(val0, val1, val2))
或者
GetRes(df$val0, df$val1, df$val2)
或者
GetRes(df[,2], df[,3], df[,4])