对于R中的日期循环

时间:2013-05-03 09:19:39

标签: r date loops for-loop

R-用户, 我有这个数据框:

head(M2006)
        X.ID_punto   MM.GG.AA  Rad_SWD 
2945377          1 0001-01-06  19.918  
2945378          2 0001-01-06  19.911   
2945379          1 0001-02-06  19.903  
2945380          2 0001-02-06  19.893   
2945381          1 0001-03-06  19.875 
2945382          2 0001-03-06  19.858  

我需要做的是为每个日期获取不同的子集(MM.GG.AA):

subset(M2006, M2006$MM.GG.AA=="0001-10-06" )

或换句话说,每个站点的不同子集(X.ID_punto):

subset(M2006, M2006$X.ID_punto==1)

是否可以在网站(X.ID_punto)或日期(MM.GG.AA)上循环播放? 我试过这样的方式:

 output<- data.frame(ID=rep(1:365))
 for  (p in as.factor(M2006[,1]))  { 
             sub<-  subset(M2006, M2006$X.ID_punto==p )
             output[,p] <- sub$Rad_SWD
      }

代码运行,但没有循环每个ID。 如果我不能循环,我必须写下子集(M2006,M2006 $ X.ID_punto == xxx)一千次...... 先感谢您! FRA

2 个答案:

答案 0 :(得分:1)

我认为,根据您对输入和所需输出的描述,您只需使用reshape包和cast函数即可实现这一点:

require(reshape)
cast( M2006 , MM.GG.AA ~ X.ID_punto , value = .(Rad_SWD) )
#   MM.GG.AA      1      2
#1 0001-01-06 19.918 19.911
#2 0001-02-06 19.903 19.893
#3 0001-03-06 19.875 19.858

它肯定比使用循环更快(它不会是绝对最快的解决方案,但我想象的是<1-2秒)。

答案 1 :(得分:0)

我自己找到了一个可能的解决方案。 我不会取消我的问题,也许有人会发现它有用。

   #first of all, since I have 1008 sites (X.ID_punto)
    #I created a list of my sites       
    list<- rep(1:1008)

    #then, create a dataframe where I'll store my subsets. 
    #Every subset will be a column of 365 observations
    output<- data.frame(site1=rep(1:365))

    #loop the subset function on list of 1008 sites
    for  (p in 1:length(list))  { 
      print(p)  #just to see if loop run
      sub<-  subset(M2006, M2006$X.ID_punto==p )
      output[,p] <- sub$Rad_SWD #add the subset, as a column, to output dataframe 
    }
    write.csv(uscita, "output.csv")#save the resulted data frame