R:将具有多个列的数据帧转换为一个连续的时间序列

时间:2013-04-26 11:51:59

标签: r dataframe time-series reshape

我在.csv文件中读入了一个data.frame对象中的R.此对象包含一个带有年份编号的列,一个带有日期编号,其余部分是每月分成不同列的每日测量值,如下所示:

> new_stn
   year day JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
1  1970   1   0   4   0   0   0   2   0   0   0   6  10   0
2  1970   2   0   0   0   0   0   2   0   0   6   6   4   0
3  1970   3   0   0   0   0   0  12   0   6   0  14   3   1
4  1970   4   0   4   0   1   2   0   0   0   6   3   2   0
5  1970   5   0   2   0   0   5   0   0   3   0  14   3   0
6  1970   6   0   0  12   0   3   2   0   4   3  NA   0   0
7  1970   7   1  23  13   2   0   5  10   3   0  NA   3   0
8  1970   8   7   0   0  13   3   1   1   2   0   8   2   0
9  1970   9   1   2   0   6   0   2   2   2   0   4  16   0
10 1970  10  13   0   0  36   0   8   0   4   5   0   7   3
11 1970  11   0   0   0   1   6   0   0   0   0   0  13   3
12 1970  12   6   3   0   0   0   5   0   0   0   0   0   0
13 1970  13   0   4   0   0   6   4   0   0   0   0  11   0
14 1970  14  10   0   0  10   0  10   0   0  NA   2   0   0
15 1970  15   1   0   0  18   0   0   0   2  NA   2   9   0
16 1970  16   0   5   0   6  16   1   5   2  NA   0   1   0
17 1970  17   0   1   0   0  10   0   2   0  NA   0   0   0
18 1970  18   0   4   0   0  10   0   0  16  NA   0   7   0
19 1970  19   0   1   0   0   4   0   8   0  NA   2   0   0
20 1970  20   0   0   0   0  22   3   6   0  NA   0   0   0
21 1970  21   0   1   0   0   0  14   2   2   9   0   0   0
22 1970  22   0   0   0   0   2   0   0   0   7   5   1   0
23 1970  23   0   0   0   0   0   0   0   4  24  26   2   0
24 1970  24   2   9   0   0   2   0   0   0   1   9   8   0
25 1970  25   0   0   0   0   2  11   0   0   0  NA  15   0
26 1970  26   0   7   2   2   5   2   0   2   0  NA   0  35
27 1970  27   0   6   0   1   2  NA   1   0   0  NA   0   0
28 1970  28   0   0   0   5   1  NA   7   0  18  16   0   0
29 1970  29   0  NA   0   9   0   0   0   0  32   0   9   0
30 1970  30   4  NA   0   0  16   0   6   0   4   4   0   0
31 1970  31   5  NA   0  NA   1  NA   0   0  NA  12  NA   4

如何将其转换为一个连续的时间序列?

我的主要问题是在考虑日期属性时进行重塑,例如闰年,日历天等。这样的事情:

> ns
           obs
1970-01-01   0
1970-01-02   0
1970-01-03   0
1970-01-04   0
1970-01-05   0
1970-01-06   0
1970-01-07   1
1970-01-08   7
1970-01-09   1
1970-01-10  13

提前致谢并抱歉这个长长的例子。

2 个答案:

答案 0 :(得分:1)

首先,将您的数据框格式格式化为长格式。

library(reshape2)
df.long<-melt(new_stn,id.vars=c("year","day"),
              variable.name="month",value.name="obs")

然后添加新列dat,其中包含来自yeardaymonth列的日期。如果日期不切实际,函数as.Date()将产生NA。

df.long<-transform(df.long,dat=as.Date(paste(year,day,month,sep="/"),"%Y/%d/%B"))

删除日期列中包含NA的行。

df.long<-df.long[!is.na(df.long$dat),]

答案 1 :(得分:1)

为了完整起见,utils(R的一部分)中的解决方案可能会使用stack

tmpStack <- stack(new_stn[3:ncol(new_stn)])
new_stn_ldf <- data.frame(
  date = as.Date(
    paste(new_stn$year, new_stn$day, tmpStack$ind, sep = "/")
    , "%Y/%d/%B"
  )
  , obs = tmpStack$values
)
new_stn_ldf <- new_stn_ldf[!is.na(new_stn_ldf$date),]