2017-04-10 6 views
0

私はこのコードを使用していますが、動作しますが、data.frameの530,000レコードを処理するのにかなりの時間がかかります(7分)。if文を最適化するR

私の目的は私のフレーム内のフィールドを作成し、以下に示すように、それは人々$月の値に基づいて移入することです:

for (i in 1:nrow(people)) { 
    if(people$Month[i]=='JAN') { 
    people[i, 'new_month'] <- "1" 
    } 
    else if(people$Month[i]=='FEB') { 
    people[i, 'new_month'] <- "2" 
    } 
    else if(people$Month[i]=='MAR') { 
    people[i, 'new_month'] <- "3" 
    } 
    else if(people$Month[i]=='APR') { 
    people[i, 'new_month'] <- "4" 
    } 
    else if(people$Month[i]=='MAY') { 
    people[i, 'new_month'] <- "5" 
    } 
    else if(people$Month[i]=='JUN') { 
    people[i, 'new_month'] <- "6" 
    } 
    else if(people$Month[i]=='JUL') { 
    people[i, 'new_month'] <- "7" 
    } 
    else if(people$Month[i]=='AUG') { 
    people[i, 'new_month'] <- "8" 
    } 
    else if(people$Month[i]=='SEP') { 
    people[i, 'new_month'] <- "9" 
    } 
    else if(people$Month[i]=='OCT') { 
    people[i, 'new_month'] <- "10" 
    } 
    else if(people$Month[i]=='NOV') { 
    people[i, 'new_month'] <- "11" 
    } 
    else if(people$Month[i]=='DEC') { 
    people[i, 'new_month'] <- "12" 
    } 
} 

は、私はif文の多くせずにこれを行うことができ、他の方法はあります私がここでやったように?おかげさまで

+0

マッチでルックアップテーブルを使用するか、ifelseステートメントがいくつかあると思います(私が推測するのを避けたいもの)。また、結合を使用することもできます。 – MLEN

+2

マッチを使用します。ループする必要はありません。 – Roland

答えて

5

matchここに行く方法です。

M <- sample(month.abb, size = 300, replace = TRUE) 

people <- data.frame(Month = toupper(M)) 

people$new_month <- match(people$Month, toupper(month.abb)) 

head(people) 

ランダムに530,000の月名を選択すると、約10ミリ秒かかります。

+0

チップをありがとう、それを試してみましょう、あなたに知らせるでしょう。これは行く方法のように見えます。 –

+0

ありがとうございます、これは非常に速く動作します:) –

関連する問題