2012-11-02 111 views
5

有誰知道如何加快運行下面的命令?我想用字符串替換數字「月」值...例如第一個月去「七月」。加速運行if .. else循環R

這個命令真的很慢,因爲我試圖實現它的數據幀非常大!

for (i in 1:length(CO2$month)){ 
    if(CO2$month[i]=='1') {CO2$months[i]<-'Jul'} else 
    if(CO2$month[i]=='2') {CO2$months[i]<-'Aug'} else 
    if(CO2$month[i]=='3') {CO2$months[i]<-'Sept'} else 
    if(CO2$month[i]=='4') {CO2$months[i]<-'Oct'} else 
    if(CO2$month[i]=='5') {CO2$months[i]<-'Nov'} else 
    if(CO2$month[i]=='6') {CO2$months[i]<-'Dec'} else 
    if(CO2$month[i]=='7') {CO2$months[i]<-'Jan'} else 
    if(CO2$month[i]=='8') {CO2$months[i]<-'Feb'} else 
    if(CO2$month[i]=='9') {CO2$months[i]<-'Mar'} else 
    if(CO2$month[i]=='10') {CO2$months[i]<-'Apr'} else 
    if(CO2$month[i]=='11') {CO2$months[i]<-'May'} else 
    if(CO2$month[i]=='12') {CO2$months[i]<-'Jun'} 
} 

回答

7

你可以不用一個循環,並沒有if-else語句:

set.seed(21) 
CO2 <- data.frame(month=as.character(sample(1:12,24,TRUE)), 
    stringsAsFactors=FALSE) 
MonthAbbRotated <- month.abb[c(7:12,1:6)] 
CO2$months <- MonthAbbRotated[as.numeric(CO2$month)] 

如果您month列是不是真的性格,這是更簡單:

set.seed(21) 
CO2 <- data.frame(month=sample(1:12,24,TRUE)) 
MonthAbbRotated <- month.abb[c(7:12,1:6)] 
CO2$months <- MonthAbbRotated[CO2$month] 
+0

大知道這一招! – Alex

+2

他的問題在這裏有6個月的滯後:1對應於「7月」而不是「1月」。因此像'month.abb [(as.numeric(CO2 $ month)+6)%% 12]'這樣的東西可以糾正滯後。 – plannapus

+0

@plannapus:很棒的捕捉,將編輯到我的回答 –

1
month =c("jul","aug","sep","oct","nov","dec","jan","feb","mar","apr","may","jun") 

for (i in 1:length(CO2$month)){ CO2$month[i] = month[as.integer(CO2$month[i])]} 
4

我可能會錯過一些東西,但爲什麼不使用一個因子?

CO2$month <- factor(CO2$month, levels=1:12, labels=c("Jul","Aug","Sept","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun"))

+0

+1非常聰明,但提問者需要在'as.character'中包裝以獲得類似於他們的示例的結果。稍微短一點的版本:'因素(CO2 $ month,levels = c(7:12,1:6),labels = month.abb)' –

+0

這是真的,但他可能並不關心因素水平與一個字符串。如果他不考慮因素也應該更節省空間(不確定如果R實習生字符串)。如果他這樣做了,那麼他可以用你指出的字符包裝它 – frankc

+0

請參閱我對你關於month.abb的回答的評論。 Op不*完全*使用該映射,但也許他的意思是 – frankc

1

這也將工作,即使它是一些地方有沒有像month.abb一個整潔的功能,使用方法:

Mon <- data.frame(month=1:12, months=c("Jul","Aug","Sept","Oct","Nov","Dec", 
           "Jan","Feb","Mar","Apr","May","Jun")) 
CO2 <- merge(CO2, Mon, by="month", all.x=TRUE) 
+0

'month.abb'不是一個函數,它只是一個預定義的對象。 –

+0

不要認爲這有所作爲,但很酷。 –