2012-02-12 10 views
94

私はR言語でプログラミングしています。私のdata.frameオブジェクト(mydf)のいくつかの列のフォーマット(クラス)をの文字からの因子に変更したいと思います。私はread.table()機能でテキストファイルを読んでいるときにこれをしたくありません。どんな助けもありがとう。 R.data.frameのカラムフォーマットを文字から因子に変換

mtcars #look at this built in data set 
str(mtcars) #allows you to see the classes of the variables (all numeric) 

#one approach it to index with the $ sign and the as.factor function 
mtcars$am <- as.factor(mtcars$am) 
#another approach 
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl']) 
str(mtcars) # now look at the classes 

の世界へ

+6

mydf $ myfavoritecolumn < - as.factor(mydf $ myfavoritecolumn) –

+0

感謝を!しかし私には別の問題があります。私は、各列の名前をcol_names []という文字配列にしています。どのように私は上記のコマンド(mydf $ col_names [i])を使用することはできません動作します。 – Rasoul

+0

data.frameはstringsAsFactorsを使ってすべての文字変数に対してこれを自動的に行う方法はありますか? –

答えて

133

こんにちは歓迎これはまた、文字、日付、整数および他のクラス

のために働くあなたがRに新しいしているので、私はあなたが持ってお勧めしたいですこれらの2つのウェブサイトを見て:

Rリファレンスマニュアル: http://cran.r-project.org/manuals.html

Rリファレンスカード:http://cran.r-project.org/doc/contrib/Short-refcard.pdf

+0

ありがとう!しかし私には別の問題があります。私は、各列の名前をcol_names []という文字配列にしています。上記のコマンドをどのように使うことができますか( 'mydf $ col_names [i]'も 'mydf [、col_names [i]]'も機能しません) – Rasoul

+0

@Rasoul、 'mydf [、col_names]'はこれを行います – DrDom

+1

+ 1を参照してください。これは基本的なものですが、これは尋ねても問題ありませんが、これらの(同様の)作業に加えられた広範な作業を認識することもできます。 –

67
# To do it for all names 
df[] <- lapply(df, factor) # the "[]" keeps the dataframe structure 
col_names <- names(df) 
# do do it for some names in a vector named 'col_names' 
df[col_names] <- lapply(df[col_names] , factor) 

説明。すべてのデータフレームはリストであり、複数の値の引数で使用される[の結果も同様にリストなので、リストをループすることはlapplyのタスクです。上記の割り当てによって、関数data.frame.[<-がデータフレームに正常に戻されるリストのセットが作成されます。df

また、ユニークなアイテムの数が何らかの基準よりも少ない列のみを変換することもできますあなたはすでにあなたのデータをロードした後の要因にあなたのdata.frameですべて文字変数を変​​更したい場合は

cols.to.factor <- sapply(df, function(col) length(unique(col)) < log10(length(col))) 
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor) 
+0

どちらかが動作するはずです。私はちょうど、あなたが '名前< - c( 'vs'、 'am'、 'gear')で試して言うように、"必 "であるというあなたの主張を偽った。 mtcars [、names] < - lapply(mtcars [、names]、factor) '..あなたの長老の批判にもっと注意を払うべきでしょう。 –

+0

これはとても良い解決策です!また、列番号を使用することもできます。列番号は、すべてではなく多くを変更したい場合に特に便利です。例えば、col_nums < - c(1,6,7:9,21:23,27:28,30:31,39,49:55,57)then df [、col_nums] < - lapply(df [、col_nums] 、因子)。 – WGray

+0

注意: 'length(col_names)== 1 'の場合、最初の解決法は機能しません。その場合、 'df [、col_names]'は自動的に長さ1のリストの代わりにベクトルに降格され、 'lapply'は列全体ではなく各エントリに対して操作しようとします。これは 'df [、col_names、drop = FALSE]'を使って防ぐことができます。 –

9

、あなたがそれを行うことができます。例として、行数のログよりも少ないですこのように、datというデータフレームに:

character_vars <- lapply(dat, class) == "character" 
dat[, character_vars] <- lapply(dat[, character_vars], as.factor) 

これは、クラスcharacterのである列識別ベクトルを作成し、次にこれらの列にas.factorを適用します。

サンプルデータ:

dat <- data.frame(var1 = c("a", "b"), 
        var2 = c("hi", "low"), 
        var3 = c(0, 0.1), 
        stringsAsFactors = FALSE 
       ) 
+0

すべての文字変数をfactorに完全に変換するのは、通常、 'stringsAsFactors = TRUE'のようにデータを読み込むときに発生しますが、' readxl'から 'read_excel()'でデータを読み込んだ場合に便利です。パッケージであり、文字変数を受け入れないランダムなフォレストモデルを訓練したいと考えています。 –

5

あなたが使用できる別の短い方法はmagrittrパッケージからパイプ(%<>%)です。文字列mycolumnを係数に変換します。

library(magrittr) 

mydf$mycolumn %<>% factor 
+0

詳細を編集してください。コード専用と「試してください」の回答は、検索可能なコンテンツが含まれていないため、推奨されません。なぜ誰かが「これを試してみる」べき理由を説明しません。私たちはここで知識のためのリソースとなるよう努力しています。 –

+0

私のDFのすべての列に使用しない場合は、pls? –

1

私は関数でそれをやっています。この場合、私は唯一の要因ために文字変数を変​​換します:

for (i in 1:ncol(data)){ 
    if(is.character(data[,i])){ 
     data[,i]=factor(data[,i]) 
    } 
} 
関連する問題