連続変数をカテゴリー変数に変換する     Last modified: Mar 28, 2006

連続変数をカテゴリー変数に変換するために使用するのは cut 関数である。オンライン・ヘルプで cut 関数を調べればたいていのことが片づく。

取っつきが悪いかも知れないので簡単な訳を付けておこう。

使用法: cut(x, breaks, labels=NULL, include.lowest=FALSE, right=TRUE, dig.lab=3)

x              対象とする連続変数データの入っている数値ベクトル
breaks         分割点を意味する複数の値で指定するか,いくつの区間に分割するかを意味する 1 個の値で指定する
labels         分割されたデータはカテゴリー・データ(factor)になる。labels でカテゴリーに名前を付けることができる
               labels = FALSE とすれば,単に整数値で表されるコードが付けられる
               デフォルトは NULL であり,「(下限値,上限値]」 のような形式のラベルが付けられる
include.lowest right = TRUE なら最小値が含まれるかどうか,right = FALSE なら最大値が含まれるかどうかを指定する
               デフォルトは include = FALSE である
right          区間の両端が含まれるかどうかの指定。「○○以上□□未満」の場合は right = FALSE にする
               デフォルトは right = TRUE つまり,「○○より大きくて□□以下(○○は含まれない)」となっているので注意が必要
dig.lab        labels が与えられないときの,数値ラベルの桁数を指定する
               デフォルトは 3 である

多くの場合,区間の定義は「○○以上,□□未満」であり,指定の簡便さを考えるとラッパーを作る方が良いであろう。

それ以外の変換が必要な場合には,cut 関数を使う必要があるので,実際にそれぞれの引数の効果を調べてみよう。

x として,1 から 10 まで 10 個の数値データを考える。

>x <- 1:10 # x <- c(1,2,3,4,5,6,7,8,9,10) と同じ意味

> cut(x, breaks=c(3,6))
 [1] <NA>  <NA>  <NA>  (3,6] (3,6] (3,6] <NA>  <NA>  <NA>  <NA> 
Levels: (3,6]
二つの数値 3,6 を与えると3つの区間に分割されると思うがそうはいかない。 (3,6] は,3 より大きくて(3 は含まない),6 以下(6 は含まれる)区間にある数値という意味のラベルであり,カテゴリーデータ factor に変換されている 3 以下と 6 より大きいものは <NA> になっている。
> cut(x, breaks=c(3,6), include.lowest=FALSE)
 [1] <NA>  <NA>  <NA>  (3,6] (3,6] (3,6] <NA>  <NA>  <NA>  <NA> 
Levels: (3,6]
right がデフォルトの TRUE であるから,もともと下限値は区間に含まれないので,意味のない指定である(指定しないのと同じ意味)
> cut(x, breaks=c(3,6), include.lowest=TRUE)
 [1] <NA>  <NA>  [3,6] [3,6] [3,6] [3,6] <NA>  <NA>  <NA>  <NA> 
Levels: [3,6]
下限値 3 は区間に含まれることになる
> cut(x, breaks=c(3,6), right=FALSE, include.lowest=TRUE)
 [1] <NA>  <NA>  [3,6] [3,6] [3,6] [3,6] <NA>  <NA>  <NA>  <NA> 
Levels: [3,6]
right が FALSE であるから,6 を含むことを指定していることになる
> cut(x, breaks=c(3,6), right=FALSE, include.lowest=FALSE)
 [1] <NA>  <NA>  [3,6) [3,6) [3,6) <NA>  <NA>  <NA>  <NA>  <NA> 
Levels: [3,6)
right が FALSE であるから,もともと上限値は区間に含まれないので,意味のない指定である(指定しないのと同じ意味)
> cut(x, breaks=c(-Inf, 3, 6, Inf))
 [1] (-Inf,3] (-Inf,3] (-Inf,3] (3,6]    (3,6]    (3,6]    (6, Inf] (6, Inf] (6, Inf] (6, Inf]
Levels: (-Inf,3] (3,6] (6, Inf]
下限値,上限値が不明(または,未確認)の場合には,無限小,無限大を breaks の最初と最後においておけばよい
> cut(x, breaks=c(1, 3, 6, 10))
 [1] <NA>   (1,3]  (1,3]  (3,6]  (3,6]  (3,6]  (6,10] (6,10] (6,10] (6,10]
Levels: (1,3] (3,6] (6,10]
下限値と上限値がわかっている場合には,breaks の最初と最後においておけばよいと思うかも知れないが,right = TRUE, include.lowest = FALSE のときには,最小値は <NA> になってしまう
> cut(x, breaks=c(1, 3, 6, 10), right=FALSE)
 [1] [1,3)  [1,3)  [3,6)  [3,6)  [3,6)  [6,10) [6,10) [6,10) [6,10) <NA>  
Levels: [1,3) [3,6) [6,10)
下限値と上限値がわかっている場合には,breaks の最初と最後においておけばよいと思うかも知れないが,right = FALSE, include.lowest = FALSE のときには,最大値は <NA> になってしまう
> cut(x, breaks=c(1, 3, 6, 10), right=FALSE, include.lowest=TRUE)
 [1] [1,3)  [1,3)  [3,6)  [3,6)  [3,6)  [6,10] [6,10] [6,10] [6,10] [6,10]
Levels: [1,3) [3,6) [6,10]
right = FALSE, include.lowest = TRUE ならば,下限値と上限値がわかっている場合には,breaks の最初と最後においておけばよい
たぶん,この設定が最も一般的であろう
> cut(x, breaks=c(1, 3, 6, 10), right=FALSE, include.lowest=TRUE, labels=c("低", "中", "高"))
 [1] 低 低 中 中 中 高 高 高 高 高
Levels: 低 中 高
labels で名前を付けることができる
> cut(x, breaks=c(1, 3, 6, 10), right=FALSE, include.lowest=TRUE, labels=FALSE)
 [1] 1 1 2 2 2 3 3 3 3 3
labels = FALSE にしておくと,単に 1 から始まる整数ベクトルになる factor ではないので「levels: ...」のサマリがない
> cut(x, breaks=c(1, 3, 6, 10), right=FALSE, include.lowest=TRUE, dig.lab=1)
 [1] [1,3)     [1,3)     [3,6)     [3,6)     [3,6)     [6,1e+01] [6,1e+01] [6,1e+01] [6,1e+01]
[10] [6,1e+01]
Levels: [1,3) [3,6) [6,1e+01]
指数部の表示に1桁しか使わないように指定したので,10 は 1e+01 と表現されている


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh