R:如何将每日时间序列的行和列排列到一列?

时间:2014-05-02 03:55:28

标签: r time time-series organization

我有一个数据集,每日时间序列,我想安排到一个列,这是我的数据:

Date       Day 1    Day 2   Day 3   Day 4   Day 5   Day 6 .... Day 31
01/01/1964  0         0       0       0       0       0         3
01/02/1964  NA       NA      NA       NA      NA      NA ...                
01/03/1964  195      445    329      121     61,6     44 ...
01/04/1964  17,2    14,9    17,1     102     54,3    9,33 ...

我想要这个:

 Day1  0
 Day2  0
       .
       .
       .
 Day31 3

我因为有366天的闰年而遇到问题,我尝试了这个,但没有成功,谢谢先进。

修改

我终于明白了,但如果有人知道更简单的方法,使用一些软件包或功能,我会感激不尽。或者我将创建自己的功能。

编辑2:

现在我有一个问题,当我没有在一年的第一个月开始。

rm(list = ls())
cat("\014")


setwd("C:/")

require(XLConnect)

# Load Streamflow Gauging Station

wb <- loadWorkbook("rainfall.xls")
Data<- readWorksheet(wb, sheet = "rainfall",header = FALSE,region = "B02:AF517")

R<- Data; ##1964 - 2006

sum(R[is.na(R)==FALSE])

# Number of days in each month

Ny<- c(31,28,31,30,31,30,31,31,30,31,30,31); # Normal Year
Ly<- c(31,29,31,30,31,30,31,31,30,31,30,31); # Leap/bissextile Year

S1<- c(1,0,0,0) # Leap year, normal year...
S2<- c(0,1,0,0) # Normal year, leap year...
S3<- c(0,0,1,0) #...
S4<- c(0,0,0,1) #...

Iab<- rep(S1,times=ceiling((nrow(R)/12)/4)); # Index of years
Iab<- Iab[1:(nrow(R)/12)];
Rnew<- matrix(numeric(0), 0,0);


#Organize data in a only collumn

for(i in 1:(nrow(R)/12)){
  for(j in 1:12){
    if(Iab[i]==0){
      Rnew<-c(Rnew, t(R[12*(i-1)+j,1:Ny[j]]))
    }else{
      Rnew<-c(Rnew, t(R[12*(i-1)+j,1:Ly[j]]))
    }
  }
}

sum(R[is.na(R)==FALSE])==sum(Rnew[is.na(Rnew)==FALSE]) #Test for succes of organize
sum(R[is.na(R)==FALSE])
sum(Rnew[is.na(Rnew)==FALSE])

2 个答案:

答案 0 :(得分:1)

我有类似的问题。然而在某种程度上更糟糕的是,因为我有几个月和几年的几次中断的排放数据(Brasilian ANA站)。 Vazao01代表当月第一天的排放,Vazao02代表第二天,数据框架上升到Vazao31(显然NA是月份的天数更少,但是现有的天数也可以是没有记录的NA)。数据看起来像这样,是data.frame&#34; ANAday&#34;

  Date Vazao01  Vazao02  Vazao03...
20 01.05.1989 3463.00 3476.500 3463.000
21 01.06.1989 1867.70 1835.900 1809.400
22 01.07.1989  809.90  798.200  774.800
23 01.08.1989  344.60  308.700  297.900
24 01.11.1989  376.50  388.100  391.000
25 01.12.1989  279.00  289.800  319.500
26 01.01.1990 1715.00 1649.000 1573.200
27 01.02.1990 1035.20 1005.800  972.200
28 01.03.1990 2905.60 2962.100       NA
29 01.06.1990      NA       NA       NA
30 01.07.1990  297.90  284.400  271.200
31 01.08.1990  228.00  223.200  218.400
32 01.08.1999      NA       NA  144.000
33 01.09.1999   20.74   18.620   16.500
34 01.10.1999  119.85  111.450   95.385
35 01.11.1999   11.20   23.705   48.370
36 01.12.1999  160.10  179.000  187.400
37 01.01.2000  843.00  865.300  914.500
38 01.02.2000 1331.30 1368.900 1387.800
39 01.04.2000 1823.60 1808.000 1789.800
40 01.05.2000 1579.00 1524.100 1445.700

我列出了包含数据的月份

ANAm=as.Date(ANAday[,1], format="%d.%m.%Y")
format(ANAm, format="%Y-%m")

比我使用&#34; monthDays&#34; Hmisc包的功能列出每个月的天数

require(Hmisc)
nodm=monthDays(ANAm)
Nodm=cbind.data.frame(ANAm,nodm)

我准备了一个data.frame,用于我希望拥有的3列数据,用于&#34; YEAR MONTH&#34;,&#34; DAY&#34;和&#34; DISCHARGE&#34;

ANATS=array(NA,c(1,3))
colnames(ANATS)=c("mY","d","Q")

使用简单的&#34; for&#34;循环以根据每个月的天数将数据提取到一列

for(i in 1:nrow(Nodm)){
selectANA=as.vector(ANAd[i,1:(Nodm[i,2]) ])
selectANA=as.vector(t(selectANA))##to generate a simple vector
dayANA=c(1:(Nodm[i,2]))
monthANA=rep(format(as.Date(Nodm[i,1]),format="%Y-%m"),times=as.numeric(Nodm[i,2]))
ANAts=cbind(monthANA,dayANA,auswahlANA)
ANATS<<-rbind(ANATS,ANAts)
}

ANATS可以转移到时间序列中:

combine.date=as.character(paste(ANATS[,1],ANATS[,2],sep="-"))
DATE=as.Date(combine.date, format="%Y-%m-%d")
rownames(ANATS)=as.character(DATE)


ANATS=ANATS[-1,]
ANAXTS=as.xts(ANATS)

答案 1 :(得分:0)

也许我无法准确理解您正在寻找的内容,但您是否试图转置数据?

t(data)