1. ホーム
  2. r

[解決済み] Rのファクター: 迷惑以上?

2023-01-28 18:14:56

質問

Rの基本的なデータ型の1つにfactorがあります。私の経験では、因子は基本的に苦痛であり、私はそれらを使用することはありません。私はいつも文字に変換します。なんか妙に物足りない気がする。

因数データ型が必要になるような、グループ化変数として因数を使用する関数の重要な例はありますか?私が べきです。 を使用する必要がありますか?

どのように解決するのですか?

要因を使うべきです。確かに面倒ですが、私の理論では、面倒である理由の90%は read.tableread.csv は、引数 stringsAsFactors = TRUE をデフォルトで使用します(そして、ほとんどのユーザーはこの微妙な点を見逃してしまいます)。私がこれらが有用であると言うのは、lme4のようなモデルフィッティングパッケージが、モデルを差動的に適合させ、使用する対照の種類を決定するために因子や順序付き因子を使用するからです。また、グラフ作成パッケージもグループ分けのためにこれらを使用します。 ggplot というように、ほとんどのモデルフィッティング関数が文字ベクトルを因子に変換しているので、結果は同じです。しかし、結局はコードに警告が表示されることになります。

lm(Petal.Length ~ -1 + Species, data=iris)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

警告メッセージ で model.matrix.default(mt, mf, contrasts) :

変数 Species に変換され factor

一つ厄介なのは、全体の drop=TRUE のビットです。ベクトルでは、これはデータにない因子のレベルを削除するためにうまく機能します。例えば

s <- iris$Species
s[s == 'setosa', drop=TRUE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

しかし とはいえ data.frame の動作は [.data.frame() の動作は異なります。 このメール または ?"[.data.frame" . 使用方法 drop=TRUEdata.frame は想像した通りには動作しません。

x <- subset(iris, Species == 'setosa', drop=TRUE)  # susbetting with [ behaves the same way
x$Species
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

幸いなことに、要素を簡単に削除することができます。 droplevels() を使用して、個々の因子や各因子の未使用の因子レベルを削除することができます。 data.frame を削除することができます (R 2.12以降)。

x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa"     "versicolor" "virginica" 
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"

これは、選択したレベルを入れないようにする方法です。 ggplot の伝説があります。

内部的には factor は整数で、属性レベルの文字ベクトル ( attributes(iris$Species)class(attributes(iris$Species)$levels) というように)、これはきれいです。もし、レベル名を変更しなければならない(しかも文字列を使っている)場合、これは much となり、効率が悪くなります。そして、私はレベル名をよく変更し、特に ggplot のような伝説があります。文字ベクトルで要素をごまかすと、1つだけ要素を変えてしまって、誤って別の新しいレベルを作ってしまう危険性があります。