0

sqldf に問題のある列を含む CSV ファイルがいくつかあり、一部の数値列が文字として分類されます。すべての列ではなく、それらの列のクラスを指定するにはどうすればよいですか? 多くの列があり、必ずしもすべてのクラスを指定する必要はありません。

これらの問題のある列のデータの多くはゼロであるため、数値 (または実数) データ型の場合、sqldf はそれらを整数として読み取ります。read.csv がクラスを正しく割り当てることに注意してください。私は適切なプロパティ (最初の 50 の値が 0、次に 51 行目の 1.45 の値) を持つ適切なデータ セットを生成するほど賢くありませんが、データをロードするための呼び出しの例を次に示します。

df <- read.csv.sql("data.dat", sql="select * from file",  
                   file.format=list(colClasses=c("attr4"="numeric")))

このエラーを返します:

Error in sqldf(sql, envir = p, file.format = file.format, dbname = dbname,  :
   formal argument "file.format" matched by multiple actual arguments

どうにかして別の read.table 呼び出しを使用して、データ型を解決できますか? すべての列を文字として読み取り、一部を数値に変換できますか? 文字である少数の数値があり、すべての数値列よりもそれらを指定する方が簡単です。私はこの醜い部分的な解決策を思いつきましたが、最終行で同じエラーメッセージで失敗します:

df.head <- read.csv("data.dat", nrows=10)
classes <- lapply(df.head, class)  # also fails to get classes correct
classes <- replace(classes, classes=="integer", "numeric")
df <- read.csv.sql("data.dat", sql="select * from file",  
                   file.format=list(colClasses=classes))
4

1 に答える 1

2

のドキュメントread.csv.sql、特に引数を詳しく見てnrowsください。

nrows: 列の型を決定するために使用される行数。デフォルトは 50 です。-1 を使用すると、列の型を決定するためにすべての行が使用されます。

read.csv.sqlandのドキュメントを見ると、もう 1 つ注意すべき点は、パラメーターsqldfがないことです。のドキュメントcolClassesを読むと、リスト内のパラメーターが に渡されるのではなく、R のデータ型を理解していない に渡されることがわかります。パラメータを変更したくない場合は、データフレーム全体を文字型として読み取り、好きなメソッドを使用して、どの列がどのクラスになるべきかを判断できます。ただし、列全体を読むまで、整数が整数か数値かがわからないという問題が常に発生します。また、速度の問題で本当に困っている場合は、CSV からの移行を検討することをお勧めします。file.formatsqldffile.formatread.tablesqliteImportFilenrows

于 2013-07-18T15:46:43.150 に答える