2012-11-02 8 views
5

Kann jemand den folgenden Befehl beschleunigen? Ich möchte die numerischen "Monat" -Werte durch eine Zeichenkette ersetzen, z. Monat 1 geht nach "Jul".Beschleunigung läuft wenn .. else Schleife in R

Dieser Befehl ist wirklich sehr langsam, da der Datenrahmen, auf dem ich ihn implementieren möchte, enorm ist!

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

Antwort

7

Sie können es ohne eine Schleife tun und ohne 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)] 

Wenn Ihr month Spalte nicht wirklich Charakter ist, ist dies noch einfacher:

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

Große diesen Trick zu wissen! – Alex

+2

Er hat hier eine Verzögerung von 6 Monaten in seiner Frage: 1 entspricht "Jul" und nicht "Jan". So etwas wie 'month.abb [(as.numeric (CO2 $ month) +6) %% 12]' würde die Verzögerung korrigieren. – plannapus

+0

@plannapus: großer Fang, wird das in meine Antwort bearbeiten –

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

Ich könnte etwas verpassen, aber warum nicht einfach einen Faktor verwenden?

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

+0

+1 sehr schlau, aber der Fragesteller müsste das in 'as.character' einbinden, um ein ähnliches Ergebnis zu erhalten. Eine etwas kürzere Version: 'Faktor (CO2 $ Monat, Level = c (7: 12,1: 6), Label = Monat.abb)' –

+0

Das stimmt, aber er interessiert sich vielleicht nicht wirklich für den Unterschied zwischen einem Faktorlevel und ein Faden. Wenn er nicht Faktor sollte sollte auch Platz sparender sein (nicht sicher, ob R Praktikanten stringt). Wenn er es tut, dann kann er es so einpacken, wie Sie angegeben haben – frankc

+0

sehen Sie meinen Kommentar zu Ihrer Antwort über month.abb. Op benutzt dieses Mapping nicht ganz, obwohl er vielleicht zu – frankc

1

Dies auch, auch wenn es für etwas funktionieren würde, wo gibt es nicht ordentlich funktionieren wie month.abb zu verwenden:

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' ist keine Funktion, es ist nur ein vordefiniertes Objekt. –

+0

Denken Sie nicht, dass das einen Unterschied macht, aber cool. –