data.frame列フォーマットを文字から因子に変換します


153

私はdata.frameオブジェクト(の一部の列の形式(クラス)を変更したいmydfから)キャラクター要因

read.table()関数でテキストファイルを読み込んでいるときに、これを実行したくありません。

任意の助けいただければ幸いです。


12
mydf $ myfavoritecolumn <-as.factor(mydf $ myfavoritecolumn)
tim riffe

ありがとう!しかし、別の問題があります。各列の名前は、文字列col_names []にあります。上記のコマンド(mydf $ col_names [i])を使用するにはどうすればよいですか。
Rasoul

data.frameがstringsAsFactorsで行うように、すべての文字変数に対してこれを自動的に行う方法はありますか?
エティエンヌローデカリ

@EtienneLow-Décarie:ちょうど結果にunclass使用data.frameします。
IRTFM 2013

回答:


197

こんにちは、Rの世界へようこそ。

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

これは、文字、日付、整数、その​​他のクラスでも機能します

Rは初めてなので、次の2つのWebサイトをご覧になることをお勧めします。

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

R参照カード: http : //cran.r-project.org/doc/contrib/Short-refcard.pdf


ありがとう!しかし、別の問題があります。各列の名前は、文字列col_names []にあります。上記のコマンドを使用するにはどうすればよいですか(どちらmydf$col_names[i]mydf[,col_names[i]]機能しません。)
Rasoul

1
@Rasoul、mydf[, col_names]これを行います
DrDom

3
参照の+1。これは基本的なものであり、質問しても問題ありませんが、これらの(および同様の)作業に組み込まれている広範な作業に注意することも問題ありません。
RomanLuštrik

84
# 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

別の戦略は、一意のアイテムの数がある基準より少ない列のみを変換することです。例として、行数のログより少ないとしましょう:

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

これはとても良い解決策です!また、すべてではなく多くを変更したい場合に特に役立つ可能性のある列番号でも機能します。たとえば、col_nums <-c(1、6、7:9、21:23、27:28、30:31、39、49:55、57)そしてdf [、col_nums] <-lapply(df [、col_nums] 、因数)。
WGray 2014

警告:の場合、最初のソリューションは機能しませんlength(col_names)==1。その場合、df[,col_names]は長さ1のリストではなく、自動的にベクトルに降格されlapply、列全体ではなく、各エントリに対して操作を試みます。これはを使用することで防ぐことができますdf[,col_names,drop=FALSE]
Pシュネル2016

それは良い点です。リストのステータスを保持する他の呼び出しは、を使用することdf[col_names]です。
IRTFM 2016

27

を使用dplyr::mutate_if()して、すべての文字列を変換するかdplyr::mutate_at()、選択した名前付き文字列を係数に変換できます。

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

data.frame内のすべての文字変数を、すでにデータをロードした後でファクターに変更たい場合は、次のようにdata.frame に変更します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
                  )

通常、すべての文字変数から因子への完全な変換は、たとえばでデータを読み取るときに発生しますstringsAsFactors = TRUEが、これはread_excel()readxlパッケージからでデータを読み取り、受け入れないランダムフォレストモデルをトレーニングする場合に役立ちます。文字変数。
Sam Firke 2016年

13

もう1つの簡単な使用方法は%<>%magrittrパッケージのパイプ()です。文字列mycolumnを因子に変換します。

library(magrittr)

mydf$mycolumn %<>% factor

詳細を編集してください。コードのみの回答と「これを試す」の回答は、検索可能なコンテンツが含まれておらず、誰かが「これを試す」必要がある理由を説明していないため、お勧めしません。ここでは、知識のリソースとなるよう努力しています。
ブライアントンプセット-汤莱恩

dfsのすべての列に使用したい場合はpls?
モスタファ2017年

5

私は関数でそれをやった。この場合、文字変数のみを因子に変換します。

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

実際に列を抽出して係数に変更するには、二重の括弧が必要だと思います。例[[i]]
RTrain3k
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.