1

次の形式の CSV データがあります。

date, total, avg, hour00, hour01, ... hour23

これを次の形式の時系列に展開したいと思います。

date-time(date + hourXX), (value of hourXX)

入力例:

      date, total, avg, hour00, hour01, hour02, hour03, ..., hour23
2013-01-27,   240,  10,      5,     15,     20,      0, ...,     14
2013-01-28,   305,  15,      9,     18,     17,     12, ...,     16

出力例 (data.frame オブジェクト):

       date-time, hourXX
2013-01-27 00:00,      5
2013-01-27 01:00,     15
2013-01-27 02:00,     20
2013-01-27 03:00,      0
...
2013-01-27 23:00,     14
2013-01-28 00:00,     15
...

したがって、hour00-hour23 列の各値は、date+hourXX に取得されたサンプルに対応します。

私はSQLでこれを行う方法を知っています.24のUNION ALLを作成し、それぞれ列を選択しますが、Rでこれを行う「スマートな」方法はありますか(または、より良い方法を知っている専門家もいるかもしれません)これはSQLで)。

おまけの質問として、これを逆に行う方法はありますか(時系列を取得してhour00-hour23形式に変換する)?

4

2 に答える 2

1

ここに力ずくのアプローチがあります。時間 c(0:3,23) の例を使用しています。関数の最初の行のコメントに注意してください。1 日のすべての時間が存在する場合にデータを再形成します。

f <- function(df) {
  hours <- paste0('hour', sprintf('%02d', c(0:3,23)))  ## paste0('hour', sprintf('%02d', 0:23))
  df <- reshape(df, direction='long', varying=hours, sep='')[c('date', 'time', 'hour')]
  df[['date-time']] <- paste0(df$date, ' ', sprintf('%02d', df$time), ':00')
  df <- df[c('date-time', 'hour')]
  df[order(df[['date-time']]),]
}

df <- read.csv(header=T, text="      date, total, avg, hour00, hour01, hour02, hour03, hour23
2013-01-27,   240,  10,      5,     15,     20,      0, 14
2013-01-28,   305,  15,      9,     18,     17,     12, 16")

f(df)
##             date-time hour
## 1.0  2013-01-27 00:00    5
## 1.1  2013-01-27 01:00   15
## 1.2  2013-01-27 02:00   20
## 1.3  2013-01-27 03:00    0
## 1.23 2013-01-27 23:00   14
## 2.0  2013-01-28 00:00    9
## 2.1  2013-01-28 01:00   18
## 2.2  2013-01-28 02:00   17
## 2.3  2013-01-28 03:00   12
## 2.23 2013-01-28 23:00   16
于 2013-01-28T04:59:22.750 に答える
0

これはあなたが望んでいたものだと思います。そうでない場合は、問題をよりよく表す例を投稿してください。

require(zoo)
txt <- scan(textConnection("2013-01-27, 240, 10, 5, 15, 20, 0"), what="character", sep=",") vals=txt[-(1:2)]> dt <- as.POSIXct(txt[1], format="%Y-%m-%d")
zoo(vals, order.by=seq(dt, by="1 hour", length=length(vals) ) )

2013-01-27 00:00:00 2013-01-27 01:00:00 2013-01-27 02:00:00 
                 10                   5                  15 
2013-01-27 03:00:00 2013-01-27 04:00:00 
                 20                   0 
于 2013-01-27T04:32:43.570 に答える