web-dev-qa-db-ja.com

read.csvとread.table

いくつかのケースで、read.table()がタブ区切りファイル(たとえば、マイクロアレイの注釈テーブル)を読み取ることができず、次のエラーを返すことがわかりました。

_Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line xxx did not have yyy elements
_

read.csv()は、同じファイルでエラーなしで完全に動作します。 read.csv()の速度もread.table()より速いと思います。

さらに:read.table()は、私のファイルを非常にクレイジーに読み取っています。 100行目の読み取り中にこのエラーが発生しますが、同じファイルの先頭の直後に90〜110行目をコピーして貼り付けると、100 + 21行のエラーが発生します(新しい行が最初にコピーされます)。その行に問題がある場合、最初に貼り付けられた行を読み取っているときになぜそのエラーを報告しないのですか? read.csv()が同じファイルをエラーなしで読み取ることを確認します。

read.table()read.csv()が機能するのと同じファイルを読み取ることができない理由を知っていますか?また、どんな場合でもread.table()を使用する理由はありますか?

17
Ali

_read.csv_は_read.table_のかなり薄いラッパーです。 _read.csv_に正しい引数を指定して_read.table_の動作を正確に再現できなかったとしたら、私はかなり驚きます。ただし、これらの引数の一部(引用符やコメント文字の処理方法など)は、関数の速度と動作を変更する可能性があります。

特に、これは_read.csv_のfull定義です。

_function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) {
     read.table(file = file, header = header, sep = sep, quote = quote, 
        dec = dec, fill = fill, comment.char = comment.char, ...)
}
_

したがって、前述のように、特定のオプションのセットを持つのは_read.table_だけです。

以下のコメントで@Chaseが述べているように、read.table()のヘルプページはDetailsの下にも同じように述べています:

read.csvとread.csv2は、デフォルト以外はread.tableと同じです。これらは、「カンマ区切り値」ファイル( ‘.csv’)または(read.csv2)を読み取るためのもので、小数点としてコンマを使用し、フィールドセパレータとしてセミコロンを使用する国で使用されています。

31
Ben Bolker

タブ区切りファイルの読み取りにread.tableを使用しないでください。read.delimを使用してください。 (これはread.tableの薄いラッパーですが、オプションを適切な値に設定します)

10
hadley

read_table()は、タブsep 'ed file and setting sep='\s+'は、テーブルのアイテムにスペースがないと想定するのに役立ちます

0
user3760541