4

他の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]))

私のデータ フレームは非常に大きく、この計算を完了するには時間がかかります。誰かが私にそれをより良くするように提案できますか?

ありがとう。

4

2 に答える 2

7

試すmapply

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

どのパッケージからのものかをお知らせいただければbitShiftR 、より大きなデータでテストして、パフォーマンスが向上するかどうかを確認できます.

UPDATE
クイックベンチマークが示すように、mapplyあなたの2倍の速さです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
于 2013-04-24T05:50:25.873 に答える
3

あなたがしていることはすべてすでにベクトル化されており、提供される他のどの代替手段よりもはるかに高速です。これを呼び出すことができます...

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

またはこれ

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

またはこれ

GetRes(df[,2], df[,3], df[,4])
于 2013-04-24T06:40:38.933 に答える