1

コンピューターの合計 RAM よりも約 10 倍大きいファイルがあります。R オブジェクトに読み込ませようとしています。これにより、ファイルを見て、より管理しやすいチャンクを抽出できるようになります。私はこれに対してさまざまなアプローチを試みましたが、それぞれに問題 (異なる問題) が発生しました。固定幅形式のファイルのコピーと、CSV 形式のファイルのコピーがあります。それ以外の点では、ファイルは同一であると思います。最初の 5000 行を読み取ることができ、固定幅ファイルの各列に仮のフィールド幅があり、両方のファイルの各列に仮のデータ クラスがあります。この時点で、全体的な目的を達成する方法を尋ねているわけではありません。代わりに、エラーの原因としてデータの形式異常を除外 (または証明) したいと考えています。ファイル全体を読み取った場合、これを行う方法がいくつかわかります。そのままではありません。

そこで、私の質問は次のとおりです。ファイル全体をメモリに読み込まずに、R で固定幅または CSV データを 1 行ずつ読み込む方法はありますか。CSV については、次を確認してください。そうでない場合は行番号を返します。• 各フィールドのデータが列クラスと一致する場合、一致しない行番号と列番号または名前を返します。

固定幅の場合、以下をチェックします。 • 文字数が常に同じかどうか。そうでない場合は行番号を返します。• 各フィールドのデータが列クラスと一致しているかどうか。行番号とフィールドの最初の文字の番号、または列番号、または列名でない場合は列名を返します。

最後に、どちらの場合も、(ファイルの最後に到達したことを確認するために) 調べた行の数をメソッドに教えてもらいたいです。また、任意の行のコピーを行番号で抽出する方法が欲しいです。 、それらを見ることができるように(ファイル全体をメモリに読み込まずに)。

固定幅の場合と CSV の場合の両方で、列クラスのチェックは、一部のフィールドまたは文字が存在しないか、形式が正しくない場合に堅牢である必要があります。次の行で。

たぶん、これを行うパッケージまたは関数がありますか? 大きなファイルの問題を除けば、これはかなり標準的なデータ クリーニング タスクのように思えます。

どんな助けでも大歓迎です。

よろしくお願いします。

4

1 に答える 1

4

オプション 1: 「実際の状況」で fwf データを使用した経験は限られていますが、大きな CSV ファイルの場合、このcount.fields機能が非常に役立つことがわかりました。これを試して:

 (table(cnts <- 
      count.fields(paste0(path,filename), sep=",", quote="", comment.char="") )

cnts次に、外れ値を持つ行番号を検索できます。たとえば、47 のフィールド カウントが 10 ~ 20 しかなく、残りは 48 であることに気付いた場合、それらの場所を出力できます。

which(cnts=47)

オプション 2: システム レベルでフィールド セパレータをカウントするために sed と grep を使用して、これに対する解決策を見たことがあると確信しています。いくつかの NIX フォーラムからこれをまとめたところ、適切に構造化された 4 行のファイル内のフィールド数の表が得られました。

fct <- table(system("awk -F ',' '{print NF}' A.csv", intern=TRUE))
fct

#3 
#4 

また、1.2 MM レコード データセットのフィールドをカウントするのに 6 秒かかり、データは R に取り込まれませんでした。

system.time( fct <- table(system("awk -F ',' '{print NF}' All.csv", intern=TRUE)) )
#   user  system elapsed 
#  6.597   0.215   6.552 

次のコマンドで行数を取得できます。

sum(fct)
于 2013-09-29T21:46:05.127 に答える