3

次のようなRに読み込みたいデータファイルがあります。

STARTOFDATA 2011-06-23 35
143 6456 23 646 123.53A 864.95 23B
343 634 24 545 65.3 235.2 94C
...
524 542 45 245.4 24 245A 45B
STARTOFDATA 2011-06-24 84
245 6532 24.4 624.2 542 23B 35A
241 4532 13.5 235.12 534.23 54 32B
etc...

ご覧のとおり、これは基本的に 2D データセット (ヘッダー行の間の各列は異なる変数です) でありSTARTOFDATA、さまざまな日を分割する行によって指定された多数の日付に対して格納されます。ヘッダー行の最後の数字は、次のヘッダー行までのデータの行数です。A、B、C などは、基本的に破棄できる品質管理情報です。おそらくgsub、ファイルから取得したテキストの a と同じです。

私の質問は、これをRに読み込むにはどうすればよいですか? 理想的には、ファイル全体または指定された日付 (または日付範囲) を読み取ることができるようにしたいと考えています。ファイルの長さが 200,000 行を超えていることを指摘しておく必要があります。

私はこれについていくつかの考えと研究を行ってきましたが、それを行うための賢明な方法を見つけることができないようです.

私が見る限り、2つの質問があります。

  1. ファイルの読み方: R でファイル内でポインターを移動する方法はありますか? 私が扱った他のいくつかの言語にはその機能があり、その場合、最初の行を読んで日付を読み、その日付が必要かどうかを確認し、そうでない場合は最後にリストされている行数をスキップできましたヘッダーを読み上げ (できれば読まずに!)、次のヘッダー行を読みます。実際に行を読み取らずにそれを可能にする関数に関するドキュメントには何も表示されません。接続オブジェクトを手動で作成すると、ファイル内のどこにいるかが追跡され、readLines を (ループで) 繰り返し呼び出してファイルのチャンクを読み込むことができます。必要ありません。

  2. データの保存方法:理想的には、各日付の 2D データセットをデータフレームに保存したいと考えています。そうすれば、それらの分析をかなり簡単に続けることができます。しかし、これらの 2D データセットの負荷をどのように保存すればよいでしょうか? データフレームのリストを考えていますが、それが最善の方法ですか (リストに賢明にインデックスを付けることができるという点で)?

アイデアやコメントをいただければ幸いです。

4

1 に答える 1

6

readLinesデータを文字ベクトルとして読み取り、このベクトルを操作するために使用します。サンプル データをブロックのリストに分割するコードを次に示します。

readLinesデータの読み取りに使用します。

x <- readLines(textConnection(
"STARTOFDATA 2011-06-23 35
143 6456 23 646 123.53A 864.95 23B
343 634 24 545 42 65.3 235.2 94C
...
524 542 45 245.4 24 542.54 245A 45B
STARTOFDATA 2011-06-24 84
245 6532 24.4 624.2 542 23B 35A
241 4532 13.5 235.12 534.23 54
etc..."))

の位置を決定し、STARTOFDATAブロックのリストに分割します。

positions <- c(grep("STARTOFDATA", x), length(x)+1)
lapply(head(seq_along(positions), -1), 
       function(i)x[positions[i]:(positions[i+1]-1)])

[[1]]
[1] "STARTOFDATA 2011-06-23 35"          
[2] "143 6456 23 646 123.53A 864.95 23B" 
[3] "343 634 24 545 42 65.3 235.2 94C"   
[4] "..."                                
[5] "524 542 45 245.4 24 542.54 245A 45B"

[[2]]
[1] "STARTOFDATA 2011-06-24 84"      
[2] "245 6532 24.4 624.2 542 23B 35A"
[3] "241 4532 13.5 235.12 534.23 54" 
[4] "etc..."  

データの各ブロックはリスト内の要素であり、必要に応じてそれを処理できます。lapply()

于 2012-07-07T20:03:44.673 に答える