2016-01-04 4 views
8

約250個の変数を持つデータフレームがあります。残念ながら、これらの変数はすべて、sqldfを使用してSQLデータベースから文字クラスとしてインポートされました。 問題:すべてが文字クラスであってはいけません。数値変数、整数、および日付があります。私はすべての変数を実行するモデルを構築したいと思います。これを行うには、変数に正しいクラスがあることを確認する必要があります。それを1つずつ行うのがおそらく最高ですが、まだ非常にマニュアルです。データフレーム内のすべての変数クラスを自動的に修正する方法

すべてのクラスを自動的に修正する方法はありますか?おそらく、列にアルファベット文字があるのか​​、数字だけがあるのか​​を検出する方法はありますか?

私はすべてのクラスを修正するのに自動アプローチが完璧であるとは考えていません。しかし、それはクラスのほとんどを修正するかもしれません、そして、それらは良くないです、私は手動で彼らを世話することができます。

データをインポートするときに誰かがこれを修正する方法を知っている場合に備えてsqldfタグを追加していますが、sqldfの障害ではなくデータベースのものであると仮定します。

答えて

8

データフレームに最も近いものを「自動」型変換は、おそらくdfがあなたのデータセットである

df[] <- lapply(df, type.convert) 

だろう。関数type.convert()

文字ベクトルを論理、整数、数値、複合体または因子に適切に変換します。

読んでいるのはhelp(type.convert)なので、あなたが望むだけかもしれません。

私の経験では、type.convert()は非常に信頼性が高く、文字を因子に強制しない場合は、as.is = TRUEを使用できます。さらに、多くの重要なR関数(read.tableなど)で内部的に使用されているので、間違いなく安全です。

irisで作業している簡単な例です。最初にすべての列を文字に変更してからtype.convert()を実行します。

## Original column classes in iris 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

## Change all columns to character 
iris[] <- lapply(iris, as.character) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "character" "character" "character" "character" "character" 

## Run type.convert() 
iris[] <- lapply(iris, type.convert) 
sapply(iris, class) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
# "numeric" "numeric" "numeric" "numeric"  "factor" 

列が元のクラスに戻っていることがわかります。これは、type.convert()が列を「最も適切な」タイプに強制するためです。

+0

こんにちはリチャード、私は最近これを別のデータフレームで使いました。このエラーはFUN(X [[i]]、...)エラーです。最初の引数はモード文字でなければならない '私はこれがなぜ起こったのかを知っていたのですが、 – jgozal

+0

のように、type.convert()は最初の引数として文字ベクトルを期待しています。私は自分のdfをas.character(df)に変換しようとしましたが、すべてをfactor型に変換しました – jgozal

+0

@jgozal文字を文字のままにして、因子に強制しない場合は、 'typeに' as.is = TRUE' .convert' –

関連する問題