0

私は R に比較的慣れていないので、経験豊富なユーザーほど明確にベクトル空間で考えることはありません。次のようにフォーマットされたデータフレームがあります。

              metric timestamp               value           tag1     tag2   tag3 tag4 tag5 tag6 tag7 tag8 tag9 tag10
1 dummy.random.unif 1367848802  0.9936670064926147 host=localhost blah=foo   NA   NA   NA   NA   NA   NA   NA    NA
2 dummy.random.unif 1367848822 0.19621700048446655 host=localhost blah=bar   NA   NA   NA   NA   NA   NA   NA    NA
3 dummy.linear      1367848842                97.6 shmoo=whatever NA         NA   NA   NA   NA   NA   NA   NA    NA
4 dummy.random.unif 1367848862  0.3171229958534241 host=localhost blah=foo   NA   NA   NA   NA   NA   NA   NA    NA
5 dummy.linear      1367848882                97.7 shmoo=whatever NA         NA   NA   NA   NA   NA   NA   NA    NA
6 dummy.random.unif 1367848902  0.2197140008211136 host=localhost blah=foo   NA   NA   NA   NA   NA   NA   NA    NA

ご覧のとおり、列tag1:tag10にはキーと値のペアが含まれています。ただし、常に同じキーではなく、常に同じ数のキーでもありません。このデータ フレームを、消費しやすいように、次のようなものに変換したいと考えています。

              metric timestamp               value   tag.host tag.blah tag.shmoo 
1 dummy.random.unif 1367848802  0.9936670064926147  localhost      foo        NA
2 dummy.random.unif 1367848822 0.19621700048446655  localhost      bar        NA
3 dummy.linear      1367848842                97.6         NA       NA  whatever
4 dummy.random.unif 1367848862  0.3171229958534241  localhost      foo        NA
5 dummy.linear      1367848882                97.7         NA       NA  whatever
6 dummy.random.unif 1367848902  0.2197140008211136  localhost      foo  whatever

手続き的にこれを行うことができることはわかっていますが、それは扱いにくいです。R を使用する正しい方法は、(ループするのではなく) ベクトル全体の操作について考えると聞いたことがあります。do.calldaply、などの正しい順列を見つけようとして数時間を費やしましたが、strsplitどこにも行きません。

この問題を解決するためのクリーンで R っぽい方法は何ですか?

4

1 に答える 1

3

が入力データ フレームの場合DFは、 を使用してワイド フォームからロング フォームに変換し、NA 行を削除して、タグをとmeltに分割し、示されているようにワイド フォームに戻します。tag.nametag.value

library(reshape2)
m <- na.omit(melt(DF, id = 1:3, value.name = "tag"))
m.tr <- transform(m, tag.name = sub("=.*", "", tag), 
                     tag.value = sub(".*=", "", tag))
dcast(metric + timestamp + metric + value ~ tag.name, data=m.tr, 
      value.var="tag.value")

出力をタイムスタンプ順にしたい場合は、最後の行でmetricとを入れ替えます。timestamp最後の行の結果は次のとおりです。

             metric  timestamp     value blah      host    shmoo
1      dummy.linear 1367848842 97.600000 <NA>      <NA> whatever
2      dummy.linear 1367848882 97.700000 <NA>      <NA> whatever
3 dummy.random.unif 1367848802  0.993667  foo localhost     <NA>
4 dummy.random.unif 1367848822  0.196217  bar localhost     <NA>
5 dummy.random.unif 1367848862  0.317123  foo localhost     <NA>
6 dummy.random.unif 1367848902  0.219714  foo localhost     <NA>
于 2013-05-06T22:22:22.953 に答える