この記事では、R言語特有のfactor型(因子型)の操作方法について解説していきます。
この記事では以下の操作方法を扱っています。
factorの作成からlevelsの変更などを紹介しています。
この記事で学べる事
- factorの作成
- levelsの変更
- labelsの変更
- levelsの取得
- levelsの数の取得
- 順序付きのfactorの作成
- factorの型の変更
また、この記事で扱うRスクリプトは以下からダウンロードできます。
R言語 factor型
factor型
以下の、関数factorを用いることでfactor型を作成したり変換することができます。
名前の通り、factor型はlevelsの要素から成るカテゴリカルデータを表現します。
またlabelsによって対応するlevelsの要素に別の名前を付けることが可能です。
factor(x = character(), levels, labels = levels, exclude = NA, ordered = is.ordered(x), nmax = NA)
引数 | 説明 |
x | factor型に変換するベクトル。 |
levels | 一意な値から成るcharacter型のベクトル。xがとる値。 |
labels | character型のベクトル。levelsの値に対応付けるラベル。 |
exclude | levelsを構成する際に排除する値。 |
ordered | logical型。順序付きのfactorを作成するかどうか。 |
nmax | levelsの数の上限。 |
実行例
上で紹介した関数の使用例について見ていきます。
factorの作成
factorを作成するには関数factorを用います。
以下、"a", "b", "c"から成るcharacter型のベクトルのfactor(因子)型を作成する例です。
関数factorを実行すると、3つの文字をlevelsに持つfactorを生成することができます。
1 2 3 4 5 6 | #factorの作成 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars) fac_charsWithLevels <- factor(chars, levels = c("a", "b")) fac_charsWithLabels <- factor(chars, levels = c("a", "b", "c"), labels = c("A", "B", "C")) |
上記の実行例は以下の通りです。実行結果の9行目から分かるように、"a", "b", "c"の3つの要素から成るベクトルcharsのfactorを作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | > #factorの作成 > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars) > fac_charsWithLevels <- factor(chars, levels = c("a", "b")) > fac_charsWithLabels <- factor(chars, levels = c("a", "b", "c"), labels = c("A", "B", "C")) > > fac_chars [1] a b a c a a b c b b Levels: a b c > > fac_charsWithLevels [1] a b a <NA> a a b <NA> b b Levels: a b > > fac_charsWithLabels [1] A B A C A A B C B B Levels: A B C |
levelsの変更
使用する頻度はあまりないですが、factor型のlevelsの変更方法を紹介しておきます。
以下の5行目のように、関数factorの引数levelsに変更後の値を渡すことでlevelsを変更することができます。
levelsにない要素はすべてNAに変換されます。
1 2 3 4 5 | #levelsの変更 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars) fac_chars <- factor(fac_chars, levels = c("a", "b")) |
実行結果は以下の通りです。
1 2 3 4 5 6 7 8 | > #levelsの変更 > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars) > fac_chars <- factor(fac_chars, levels = c("a", "b")) > > fac_chars [1] a b a <NA> a a b <NA> b b Levels: a b |
labelsの変更
引数labelsを設定することでfactorのlabelsを変更することが可能です。
levelsの要素のインデックスに対応するようにlabelsが設定されます。
1 2 3 4 5 | #labelsの変更 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars, levels = c("a", "b", "c"), labels = c("A", "B", "C")) fac_chars <- factor(fac_chars, labels = c("alpha", "beta", "gamma")) |
実行結果は以下の通りです。"A", "B", "C"のlabelsを持つfactorが"alpha", "beta", "gamma"のlabelsのfactorに変更されているのが分かります。
1 2 3 4 5 6 7 8 | > #labelsの変更 > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars, levels = c("a", "b", "c"), labels = c("A", "B", "C")) > fac_chars <- factor(fac_chars, labels = c("alpha", "beta", "gamma")) > > fac_chars [1] alpha beta alpha gamma alpha alpha beta gamma beta beta Levels: alpha beta gamma |
levelsの取得
factorのlevelsを取得したい場合は、関数levelsを用います。
関数levelsの引数にfactorを指定すると、levelsを取得することができます。
1 2 3 4 5 6 | #levelsの取得 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars) fac_chars <- factor(fac_chars) levels_chars <- levels(fac_chars) |
実行例は以下の通りです。charは"a", "b", "c"のlevelsから成るfactorであるため、関数levelsを実行すると、"a", "b", "c"から成るベクトルが返ってきます。
1 2 3 4 5 6 7 8 | > #levelsの取得 > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars) > fac_chars <- factor(fac_chars) > levels_chars <- levels(fac_chars) > > levels_chars [1] "a" "b" "c" |
levelsの数の取得
levelsの取得に続いて、levelsの数の取得について紹介します。
levelsの取得と同様に、関数nlevelsを用いることでfactorのlevelsの数を取得することができます。
1 2 3 4 5 6 | #levelsの数の取得 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars) fac_chars <- factor(fac_chars) nlevels_chars <- nlevels(fac_chars) |
以下、実行結果です。
1 2 3 4 5 6 7 8 | > #levelsの数の取得 > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars) > fac_chars <- factor(fac_chars) > nlevels_chars <- nlevels(fac_chars) > > nlevels_chars [1] 3 |
順序付きのfactor
また、引数orederedをTRUEにすることで、順序付きのfactorを作成することができます。
引数levelsで指定した順番で順序が与えられます。左から右の順で大きくなります。
次の例の"small", "medium", "large" のように、順序関係があるfactorを生成したいときに用います。
1 2 3 4 5 | #順序付きのfactor sizes <- c("small", "large", "medium", "medium", "small", "medium", "large") fac_sizesWithOrder <- factor(sizes, levels = c("small", "medium", "large"), ordered = TRUE) fac_sizesWithOrder[1] < fac_sizesWithOrder[2] |
上記の実行結果は以下の通りです。
"small"は"large"より小さくなるように4行目の引数levelsとorderedで宣言しているので、最後の論理演算はTRUEとなります。
1 2 3 4 5 | > #順序付きのfactor > sizes <- c("small", "large", "medium", "medium", "small", "medium", "large") > fac_sizesWithOrder <- factor(sizes, levels = c("small", "medium", "large"), ordered = TRUE) > fac_sizesWithOrder[1] < fac_sizesWithOrder[2] [1] TRUE |
factorの型の変換
最後にfactor型の型の変換方法について見ていきます。
factor型を他の型(numeric、character)に変換する例を以下にまとめました。
関数as.numeric、as.characterを用いることでfactor型をそれぞれnumeric、character型に変換することができます。
1 2 3 4 5 6 7 8 9 10 | #factorから他の型への変換 chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") fac_chars <- factor(chars) as.character(fac_chars) numbers <- c(1, 3, 2, 2, 1, 2, 3, 1, 2, 2) fac_numbers <- factor(numbers) as.numeric(as.character(fac_numbers)) |
実行結果は以下の通りです。factor型からcharacter型に変換する例の実行結果です。
1 2 3 4 5 | > chars <- c("a", "b", "a", "c", "a", "a", "b", "c", "b", "b") > fac_chars <- factor(chars) > > as.character(fac_chars) [1] "a" "b" "a" "c" "a" "a" "b" "c" "b" "b" |
次はnumeric型への変換の実行結果です。
1 2 3 4 5 | > numbers <- c(5, 4, 6, 7, 6, 4, 4, 5, 6, 5) > fac_numbers <- factor(numbers) > > as.numeric(as.character(fac_numbers)) [1] 5 4 6 7 6 4 4 5 6 5 |
ただし、numeric型に変換する際は、一度as.characterで文字列に変換する必要があります。character型に変換しないでas.numericを実行すると次のように、levelsのインデックスに変換されてしまいます。
1 2 | > as.numeric(fac_numbers) [1] 2 1 3 4 3 1 1 2 3 2 |
まとめ
R言語でfactor型の操作方法について解説しました。
関数factorでfactorを作成することができます。
引数levelsで因子の要素を設定し、lablesで各要素に対応するラベルを設定することができます。
またorderedをTRUEにすることで、順序付きのfactorを作成することもできます。