1

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)一千次......提前谢谢你!弗拉

4

2 回答 2

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 秒)。

于 2013-05-03T12:47:36.770 回答
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
于 2013-05-03T10:13:57.050 回答