data.tableをggplot2で扱いやすい構造に変換する

ggplot2で複数の系列をプロットする際、データを保持するdata.tableオブジェクトが扱いにくい構造をとっていることがある。

ggplot2で扱いにくい構造

例えば、以下のように表側の要素(Timestamp)と表頭の要素(Key1もしくはKey2)で観測値(a~f)が定まるようなケースだ。この場合、系列Key1の折れ線グラフと系列Key2の折れ線グラフを描画しようとすると、各系列に対してgeom_line()を実行する必要がある。系列が増えると厄介だ。

  • 元のdata.tableオブジェクト(dataTable)
Timestamp| Key1| Key2
---------+-----+-----
        1|    a|    b
        2|    c|    d
        3|    e|    f

扱いやすい構造に変換

このようなときは、data.tableをmelt()してやればよい。dataにdata.tableオブジェクトを、id.varsにidとなる列を指定する(ベクトル型で複数指定可)。ここでidとは、RDBの世界で言うところの主キーである。

moltenDataTable <- 
    melt(data = dataTable, id.vars = "Timestamp")

melt()されたdata.tableオブジェクトの構造は以下のようになる。1レコード1観測値の構造となる。

  • melt()されたdata.tableオブジェクト(moltenDataTable)
Timestamp|Variable|Value
---------+--------+-----
        1|    Key1|    a
        1|    Key2|    b
        2|    Key1|    c
        2|    Key2|    d
        3|    Key1|    e
        3|    Key2|    f

melt()に伴う強制的な型変換

なお、melt()する際に各系列のデータ型が異なると、一定の規則に従って型変換が行われる。その際は警告メッセージが出力される。
警告メッセージを出さないようにするには、melt()する前に明示的に型変換を行う。以下は各列をdouble型に変換する例である。

dataTable <- dataTable[, lapply(.SD, as.double), by = Timestamp]