5

次のコマンドの実行を高速化する方法を知っている人はいますか?数値の「月」の値を文字列に置き換えたい...たとえば、月1は「7月」になります。

このコマンドは、実装しようとしているデータフレームが膨大であるため、非常に低速です。

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'}
}
4

4 に答える 4

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]
于 2012-11-02T16:26:09.623 に答える
4

何か不足している可能性がありますが、係数を使用しないのはなぜですか?

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

于 2012-11-02T16:35:57.583 に答える
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])]}
于 2012-11-02T16:35:03.177 に答える
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)
于 2012-11-02T16:36:42.223 に答える