0

さまざまな条件に基づいて行に評価を割り当てるループを高速化することを目指しています。さまざまな条件に基づいて割り当てられる6つの異なる評価(0から5)があります。条件ごとにifステートメントを含むforループを使用してこれを実行しようとしましたが、何百万もの行を使用してこれを実行することは実際にはオプションではありません。終了するのにどれくらいの時間がかかったかさえわかりません。手動で停止する前に、何時間も実行されていました。

ルールは次のとおりです。

Rating 0: if df$Bounce >= 75 and df$time<10 and df$view<1
Rating 1: if df$Bounce >= 75 or df$Assist<1
Rating 2: if df$Bounce < 75 and df$Assist<2
Rating 3: if df$Bounce < 75 and df$Assist<3
Rating 4: if df$Bounce < 75 and df$Assist<=4
Rating 5: if df$Bounce < 75 and df$Assist>=5

スクリプトにはこれらの「遅い」ステートメントがたくさんあるので、この質問への回答は多くのプロセスをスピードアップします!

小さなサンプルデータセット

tc <- textConnection('
belongID   uniqID   Bounce     Assist   time   view    
   1           101     90       10       7       0      
   1           102     75        0       8      10
   2           103     10       30       4       2
   2           104     50        3       1      10
   2           105     74        2       5       4
   3           106      5        1       2       8  ')

df <- read.table(tc,header=TRUE)

結果は、新しい列の評価とルールに従った評価を持つ同じデータセットになるはずです。

belongID   uniqID   Bounce     Assist   time   view     Rating    
   1           101     90       10       7       0       0
   1           102     75        0       8      10       1
   2           103     10       30       4       2       5
   2           104     50        3       1      10       4
   2           105     74        2       5       4       3
   3           106      5        1       2       8       2

編集:評価1の条件を変更しました!

4

3 に答える 3

3

これはあなたが求めることをする関数の簡単なアルゴリズムです。これには3つのルールしか含まれていないため、非常に高速である必要があります。(ただし、私Assistは常に整数であるという暗黙の仮定をします。)

rating <- function(Bounce, Assist, time, view){
  x <- pmin(5, Assist + 1)
  x[Bounce >= 75 & time<10 & view<1] <- 0
  x[Bounce >= 75 & Assist < 1] <- 1
  x
}

within(df, rating <- rating(Bounce, Assist, time, view))

  belongID uniqID Bounce Assist time view rating
1        1    101     90     10    7    0      0
2        1    102     75      0    8   10      1
3        2    103     10     30    4    2      5
4        2    104     50      3    1   10      4
5        2    105     74      2    5    4      3
6        3    106      5      1    2    8      2
于 2012-06-21T14:04:59.450 に答える
2

ループを使用しないでください:

df$rating <- 999

df[df$Bounce >= 75 & df$time < 10 & df$view<1, "rating"] <- 0
df[df$Bounce >= 75 & df$Assist < 1 & df$rating == 999, "rating"] <- 1
df[df$Bounce < 75 & df$Assist < 2 & df$rating == 999, "rating"] <- 2
df[df$Bounce < 75 & df$Assist < 3  & df$rating == 999, "rating"] <- 3
df[df$Bounce < 75 & df$Assist <= 4  & df$rating == 999, "rating"] <- 4
df[df$Bounce < 75 & df$Assist >= 5 & df$rating == 999, "rating"] <- 5

rating == 999ルールは相互に排他的ではないため、チェックが必要です。必要な場合は、ロジックにエラーがあります。それ以外の場合、これにより、以前のルールをオーバーライドするルールがなくなります。

于 2012-06-21T13:53:44.447 に答える
1

試す

dumfun<-function(w,x,y,z){
if(w>=75&&x<10&&y<1){return(0)}
if(w>=75&&z<1){return(1)}
if(w<75&&z<2){return(2)}
if(w<75&&z<3){return(3)}
if(w<75&&z<5){return(4)}
if(w<75&&z>5){return(5)}
}

df$Rating<-mapply(dumfun,df$Bounce,df$time,df$view,df$Assist)
于 2012-06-21T13:55:09.253 に答える