web-dev-qa-db-ja.com

data.frame列フォーマットを文字から因数に変換

Data.frameオブジェクト(mydf)のいくつかの列のフォーマット(クラス)をcharactorからfactorに変更します。

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

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

126
Rasoul

こんにちは。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

171
Tyler Rinker
# 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)
75
42-

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)
16
sbha

Data.frame内のall文字変数を既にデータをロードした後に因数に変更したい場合は、datというdata.frameにこのようにすることができます。

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
                  )
14
Sam Firke

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

library(magrittr)

mydf$mycolumn %<>% factor
10
chrimuelle

関数でやっています。この場合、文字変数を因数に変換するだけです。

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