11

ここに初めて投稿するので、必要なヘルプについてできるだけ明確にしようと思います。私は R の初心者で、これが初めての独立したプログラミング経験です。

私は約 2.5 年間の株式ティック データを持っており、毎日独自のファイルがあります。ファイルは .txt で、約 2,000 万から 3,000 万行で構成され、平均するとそれぞれ 360 MB になると思います。今のところ、一度に1つのファイルで作業しています。これらのファイルに含まれるすべてのデータが必要なわけではなく、プログラミングを使用してファイルを少し最小限に抑えたいと思っていました。

今私の問題は、Rが私が何をする必要があるかを理解できるように、適切なコードを書くのに苦労していることです。

最初にデータの一部を表示して、フォーマットの概要を理解してもらいます。

M977
R 64266NRE1VEW107 FI0009653869 2EURXHEL 630 1
R 64516SSA0B 80SHB SE0002798108 8SEKXSTO 40 1
R 645730BBREEW750 FR0010734145 8EURXHEL 640 1
R 64655OXS1C 900SWE SE0002800136 8SEKXSTO 40 1
R 64663OXS1P 450SWE SE0002800219 8SEKXSTO 40 1
R 64801SSIEGV LU0362355355 11EURXCSE 160 1
M978

データの別の抜粋:

M732
D 3547742
A 3551497B 200000 67110 02800
D 3550806
D 3547743
A 3551498S 250000 69228 09900

ご覧のとおり、各行は文字で始まります。各文字は、行が何を意味するかを示します。たとえば、Rオーダー ブック ディレクトリ メッセージ、M最後の 1 秒後のミリ秒、H株式取引アクション メッセージを意味します。全部で14種類の文字が使われています。

関数を使用しreadLinesてデータを R にインポートしました。ただし、データを操作したい場合、R の処理に非常に長い時間がかかるようです。

Rここで、最初の文字がオフセット 1 から 4 までの場合、コードは市場セグメント識別子などを意味し、R にこれらに列を追加させて、より多くのデータを操作できるようにする、ある種の If 関数を作成したいと思います。構造化されたファッション。

そのようなデータをインポートし、何らかの形式の構造を作成する最良の方法は何ですか。つまり、データの行で一意の ID 情報を使用して、一度に 1 つの株を分析するなどです。

4

2 に答える 2

1

次のようなものを試すことができます:

options(stringsAsFactors = FALSE)

f_A <- function(line,tab_A){
  values <- unlist(strsplit(line," "))[2:5]
  rbind(tab_A,list(name_1=as.character(values[1]),name_2=as.numeric(values[2]),name_3=as.numeric(values[3]),name_4=as.numeric(values[4])))
}

tab_A <- data.frame(name_1=character(),name_2=numeric(),name_3=numeric(),name_4=numeric(),stringsAsFactors=F)

for(i in readLines(con="/home/data.txt")){
    switch(strsplit(x=i,split="")[[1]][1],M=cat("1\n"),R=cat("2\n"),D=cat("3\n"),A=(tab_A <- f_A(i,tab_A)))
}

そしてcat()、各タイプの data.frame に値を追加するさまざまな関数に置き換えます。関数のパターンを使用しf_A()て、テーブル構造の他の関数と同じものを構築します。

于 2012-07-26T13:16:58.690 に答える
0

readLines()コマンドを正規表現と組み合わせることができます。正規表現の詳細については、R ヘルプ サイトを参照してください。grep()

> ?grep

したがって、すべての行を確認し、各行の意味を確認してから、行の内容を好きなように処理または保存できます。(正規表現は、データを 1 行に分割するのにも役立ちます...)

于 2012-08-12T13:59:36.473 に答える