2016-08-24 3 views
0
私は何度も呼ばれ、次の2つのコマンドは、ほとんどの時間を消費することを発見しますRコードを最適化しています

R:最適化のサブセットとドロップ率レベル

dataset <- dataset[which(dataset$responder==T),] 

    for (i in 1:ncol(dataset)) 
    if (is.factor(dataset[,i])) 
     dataset[,i] <- dataset[,i][drop=T] 

私は方法があるかどうかを確認するためにグーグルでみましたがこれらを最適化するためには何も見つかりませんでした。これらのラインを改善する方法はありますか?理想的には、ソリューションはコンパイルする必要はなく、コードを読むことができないようにすべきです。

+1

'データセット[データセットの$レスポンダ]' '[、(データセットの$レスポンダー== T)]'データセットよりも高速ではないでしょうか? –

+1

@BenBolker:提案していただきありがとうございます。 which()はきわめて最適化された関数であるようです。いくつかのシミュレーションを実行すると、私は論理ベクトルを直接使用するだけで平均110ミリ秒(平均)となります。中央値は87から77に改善されています。しかし、あなたの提案を使用する際、出力にNA行を生成するため、データセットにNAがないことを確認する必要があります。 –

+0

@BenBolker:isTRUEは同一(TRUE、x)の略語であり、このシナリオでは使用しないでください。ベクトルの長さが1より大きい場合は常にFALSEを返します。 –

答えて

1

ベクトル化を使用すると、コードが少し速くなります。

dataset <- droplevels(dataset[dataset$responder==T,]) 

TEST

library(microbenchmark) 

# data 
testdata=data.frame(type=c(rep("a", 5000), rep("b", 5000), rep("c",5000)), 
    responder=c(rep(TRUE, 4000), rep(FALSE,11000))) 

# functions 
orig <- function(){ ...code in question... } 
vect <- function(){ ...code in answer... } 

microbenchmark(orig()) 
Unit: microseconds 
    expr min  lq  mean median  uq  max neval 
orig() 638.27 654.929 793.7463 668.535 688.643 6650.592 100 
microbenchmark(vect()) 
Unit: microseconds 
    expr  min  lq  mean median  uq  max neval 
vect() 618.021 636.0365 768.6891 643.895 665.27 5122.989 100 
関連する問題