2017-04-10 75 views
0

我有這樣的一段代碼,但它的工作原理聲明 - 它需要相當一段時間來處理53萬條記錄(7分鐘),我data.frame。優化,如果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

你可以使用一個LookupTable中與之相匹配的,或者有幾個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

謝謝,這個工程和很多更快:) –