これは良い質問で、R で日付を処理する際の難しさの一部を浮き彫りにしています。lubridate パッケージは非常に便利なので、以下に 2 つのアプローチを示します。
元の投稿のデータフレーム (の最初の 2 行) を再作成します。
foo <- data.frame(start.time = c("2012-02-06 15:47:00",
"2012-02-06 15:02:00",
"2012-02-22 10:08:00"),
duration = c(1,2,3))
POSIXct および POSIXt クラスに変換します (これを行うには 2 つの方法があります)
# using base::strptime
t.str <- strptime(foo$start.time, "%Y-%m-%d %H:%M:%S")
# using lubridate::ymd_hms
library(lubridate)
t.lub <- ymd_hms(foo$start.time)
ここで、時間を10進数で抽出します
# using base::format
h.str <- as.numeric(format(t.str, "%H")) +
as.numeric(format(t.str, "%M"))/60
# using lubridate::hour and lubridate::minute
h.lub <- hour(t.lub) + minute(t.lub)/60
これらのアプローチが等しいことを示します。
identical(h.str, h.lub)
次に、上記のアプローチのいずれかを選択して、10 進数の時間を に割り当てますfoo$hr
。
foo$hr <- h.str
# If you prefer, the choice can be made at random:
foo$hr <- if(runif(1) > 0.5){ h.str } else { h.lub }
次に、ggplot2 パッケージを使用してプロットします。
library(ggplot2)
qplot(foo$hr, foo$duration) +
scale_x_datetime(labels = "%S:00")