我在.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
提前致谢并抱歉这个长长的例子。
答案 0 :(得分:1)
首先,将您的数据框格式格式化为长格式。
library(reshape2)
df.long<-melt(new_stn,id.vars=c("year","day"),
variable.name="month",value.name="obs")
然后添加新列dat
,其中包含来自year
,day
和month
列的日期。如果日期不切实际,函数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),]