在R中加速运行if .. else循环

Rod*_*ger 5 r

有谁知道如何加快运行以下命令?我想用字符串替换数字"月"值...例如,第1个月转到"Jul".

这个命令真的很慢,因为我试图实现它的数据帧是巨大的!

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'}
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ich 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)]
Run Code Online (Sandbox Code Playgroud)

如果您的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]
Run Code Online (Sandbox Code Playgroud)

  • 他的问题在这里有6个月的滞后:1对应于"Jul"而不是"Jan".所以像`month.abb [(as.numeric(CO2 $ month)+6)%% 12]`这样的东西会纠正滞后. (2认同)