2012-11-02 11 views
5

誰でも次のコマンドの実行をスピードアップする方法を知っていますか?私は数字の "月"値を文字列で置き換えたいと思っています。 1月は「7月」になります。実行中のスピードアップelse loop in 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は "Jan"ではなく "Jul"に対応します。したがって、 'month.abb [(数値として(CO2 $月)+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'でそれを囲む必要があります。少し短いバージョン: 'factor(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

違いはありますが、涼しいとは思わないでください。 –