14

の形でデータ構造を作成したい

Start, End, Elements
  3  , 6  ,  {4,5}
  4 ,  10 ,  {7,8,9}
   ....

つまり、線に沿ってボールを動かしています。「開始」はボールの最も左の位置を表し、「終了」は最も右の位置を表します。「要素」とは、どういうわけかそれらの位置が特別だと思うことを意味します。要素の数が非常に大きくなる可能性がある場合に使用するのに最適なデータ構造は何ですか? 私が考えることができる唯一のものは、3 番目の列が適切にフォーマットされた文字列であるデータ フレームです。セット内の各数値を調べたい場合は、文字列を解析する必要があります。Rが持っているより良いデータ形式はありますか、それともそれについてですか?

ありがとう!

4

2 に答える 2

7

幅の広いデータ フレームではなく、背の高いデータ フレームとして格納し、おそらく を使用しdata.tableて効率的に処理できます。つまり、始点と終点のペアごとに 1 行ではなく、要素ごとに 1 行を作成します。

library(data.table)
dt = data.table(Start=c(3, 3, 4, 4, 4), End=c(6, 6, 10, 10, 10), Elements=c(4, 5, 7, 8, 9))
#   Start End Elements
#1:     3   6        4
#2:     3   6        5
#3:     4  10        7
#4:     4  10        8
#5:     4  10        9

これにより、各範囲にいくつの要素があるかを判断するなど、データに対して複数の種類の処理を非常に簡単に行うことができます。

dt[, list(Num.Elements=length(Elements)), by=c("Start", "End")]

#    Start End Num.Elements
# 1:     3   6            2
# 2:     4  10            3

これにより、パッケージを使用したプロットでデータを使いやすくすることもできggplotます。通常、データは縦長の形式であることが期待されます。

このデータ構造は、要素ごとに Start と End を繰り返すため、無駄であることに気付くかもしれません。ただし、データ テーブルは非常に効率的に格納されます。要素のリストが文字通り数百万の長さであっても、この方法で簡単に収まり、処理できます。次のような行を試してください:

dt = data.table(Start=1:1e6, End=1:1e6, Elements=1:1e6)

デモンストレーション用。各要素リストを文字列として保持し、毎回分割するよりも、確実に処理が高速になります

于 2013-04-12T20:36:36.390 に答える