将数据按照月份、季度、年份划分及求某个代码(地名、产业名等)对应的累积值

来源:互联网 发布:js防水卷材与sbs 编辑:程序博客网 时间:2024/04/29 10:35
#将数据按照月份划分
#假如数据框是data,第一列是数据,第二列是日期(格式是2014-01),第三列是地名(local),第四列是产业名(product)
ds<-sort(as.character(unique(data[,2])))#将所有的日期提取出来,形成可能出现的月份,并排序
m1<-length(ds)
data2<-list()
for(k in 1:m1){
   dv<-data[data[,2]==ds[k],]#每个月的数据
   data2[[k]]<-dv[order(dv[,3]),]#将每个月的数据按照地理名称(默认是汉语拼音首字母)排序
}
#这样就得到了每个月的数据,而且是按照地理名称排名的


#接下来就得到各个季度的季度值(季度值是累加的,如第二季度其实是前六个月的累计值)
#先将数据按照各个季度合在一起
#首先将月份数据转化为季度数据
m2<-m1/3#每个季度三个月
data3<-list()
for(k in 1:m2)
 data3[[k]]<-rbind(data2[[3*k-2]],data2[[3*k-1]],data5[[2*k]])


#再算出各个季度的当季(三个月,比如:第二季度其实是6,7,8三个月)数据
fun1<-function(data3){
    data3<-data3[order(data3[,3]),]#按照地理名称排名
    dm1<-unique(data3[,3]);#地名
    dv5<-c()
    for(i in 1:length(dm1)){
      dv2<-data3[data3[,3]==dm1[i],]
      dm2<-unique(dv2[,4])#产业名
      dv4<-c()
      for(j in 1:length(dm2)){
        dv3<-c(dm1[i],dm2[j],sum(as.numeric(dv2[dv2[,4]==dm2[j],1])))
        dv4<-rbind(dv4,dv3)
      }
      dv5<-rbind(dv5,dv4)
    }
    return(dv5)#这样得到的数据格式为(“地名”,“产业名”,数据)
  }
data4<-list()
  for(k in 1:m2)
    data4[[k]]<-fun1(data3[[k]])#得到数据的当期值


#最后计算出季度值(累积值)
data5<-rbind(data4[[1]],data4[[2]])#2季度合并
data6<-rbind(data4[[1]],data4[[2]],data4[[3]])#3季度合并
data7<-rbind(data4[[1]],data4[[2]],data4[[3]],data4[[4]])#4季度合并
  
data8<-fun1(data6)#2季度累积值
data9<-fun1(data6)#3季度累积值
data10<-fun1(data7)#4季度累积值

data_q<-list(data4[[1]],data8,data9,data10)#四个季度的累积值
#需要注意,其实每年的第四个季度的累积值就是年份数据,所以就不用都说了哈


#将同一地区的数据累加
#自己编写的函数

data11<-list()
for(k in 1:m2){
  dm<-unique(data_q[[k]][,1])
  dv2<-numeric(length(dm))
  for(i in 1:length(dm)){
    dv2[i]<-sum(as.numeric(data_q[[k]][data_q[[k]][,1]==dm[i],3]))#将某个地名的数据累加求和
  }
  data11[[k]]<-dv2

}
#利用reshape2包
library(reshape2)#先安装该包,再library
data12<-dcast(data_q,local~product,sum);#以变量local作为行,product作为列输出数据


1 0