【问题标题】:R: convert dataframe with multiple columns for months into one continuous time-seriesR:将具有多列数月的数据帧转换为一个连续的时间序列
【发布时间】:2013-04-20 14:07:05
【问题描述】:

我已将 .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

在此先感谢,对于冗长的示例感到抱歉。

【问题讨论】:

    标签: r dataframe time-series reshape


    【解决方案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),]
    

    【讨论】:

      【解决方案2】:

      为了完整起见,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),]
      

      【讨论】:

        猜你喜欢
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多