因子Tips大全
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
// 2007.8.31 間瀬
SIZE(20){COLOR(blue){因子 Tips 大全}}
前置き:初級Q&Aでデータフレーム中の因子変数の件で悩まれて...
Rの因子(factor)は整数値ベクトルの一種類と考えられるが,そ...
より間接的に表現される.結果として、同じ値を持つケースが...
因子は統計モデル関数で特に重要(help(contrasts)参照)になる.
** ベクトルを因子にする factor() [#bd9f5f1f]
関数 factor() はベクトルを因子にする.Sとの互換性のために...
データフレーム等を操作する関数の内部で,変数を因子化する...
書式: factor(x = character(), levels = sort(unique.defau...
labels = levels, exclude = NA, ordered = is...
is.factor(x), is.ordered(x), as.factor(x), as.orde...
引数: x データのベクトル.普通小数の異なる値を持つ
levels オプション.xが持ち得る値のベクトル.既定で...
labels 水準に対するオプションのラベル,もしくは長...
exclude 水準を作る際除かれる値のベクトル.xと同じ型...
ordered 水準は与えられた順番で順序つけられているか...
もし ordered = TRUE ならば因子水準は順序つけられていると...
違いであるが,モデル当てはめ関数等では全く異なった扱いが...
levels[j] に 等しければ x[i] の水準は j とされる.exclude...
ない.水準値集合 levels は既定でデータ値から決まるが,も...
NA とされる.数値 x に対し exclude=NULL とすると NA 値は...
値とされる.
返り値はクラス属性 "factor" を持つオブジェクトで,属性 "l...
モード character を持つ x と同じ長さの整数値コードの集合...
順序つけられた場合はクラス属性 c("ordered", "factor") を...
因子の実際の解釈はコードと水準集合双方に依存する.水準集...
因子の比較には as.numeric(levels(f))[f] で数値ベクトル化...
勧められる.因子水準は既定でソートされるが,ソートはロケ...
例え小数でも同じ値が頻繁に繰り返されている文字列データは...
量が減る.32ビット機では n バイトの文字列の保管には 28 + ...
バイトが必要だが,因子であれば4バイトで済む.64ビット機で...
> (ff <- factor(substring("statistics",1:10,1:10), level...
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> as.integer(ff)
[1] 19 20 1 20 9 19 20 9 3 19
> factor(ff) # 水準集合...
[1] s t a t i s t i c s
Levels: a c i s t
> factor(letters[1:20], label = "letter") # 水準名の...
[1] letter1 letter2 letter3 letter4 letter5 letter...
[9] letter9 letter10 letter11 letter12 letter13 letter...
[17] letter17 letter18 letter19 letter20
20 Levels: letter1 letter2 letter3 letter4 letter5 lette...
> (x <- factor(c(1, 2, "NA"), exclude = "")) # NAを水準...
[1] 1 2 NA
Levels: 1 2 NA
**水準パターンを与えて因子を作る gl() [#j0d5278d]
関数 gl() は水準パターンを与えて因子を作る.
書式: gl(n, k, length = n*k, labels = 1:n, ordered = FAL...
引数: n 水準数
k 繰り返し数
length 結果の長さ
labels 水準に対するオプションラベル
ordered 論理値.水準は順序つけられているとみなすか?
> gl(2, 8, label = c("Control", "Treat"))
[1] Control Control Control Control Control Control Con...
[10] Treat Treat Treat Treat Treat Treat Tre...
Levels: Control Treat
> gl(2, 1, 20)
[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
Levels: 1 2
> gl(2, 2, 20)
[1] 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
Levels: 1 2
** 組合せ因子を作る interaction() [#r7c2f10e]
関数 interaction() は複数因子の水準の組合せからなる因子を...
書式: interaction(..., drop = FALSE, sep = ".")
引数: ... 複数の因子,もしくはそれらのリスト
drop もしTRUEなら,使われていない水準は除かれる.既...
sep それらを結合して新しい水準ラベルを作る文字列
結果は常に順序つけられない.水準ラベルは元の水準ラベルを...
結合したものになる.
> a <- gl(2, 4, 8)
> b <- gl(2, 2, 8, label = c("ctrl", "treat"))
> s <- gl(2, 1, 8, label = c("M", "F"))
> interaction(a, b)
[1] 1.ctrl 1.ctrl 1.treat 1.treat 2.ctrl 2.ctrl 2.tr...
Levels: 1.ctrl 2.ctrl 1.treat 2.treat
> interaction(a, b, s, sep = ":") # 分離記号を変える
[1] 1:ctrl:M 1:ctrl:F 1:treat:M 1:treat:F 2:ctrl:M 2:...
[8] 2:treat:F
8 Levels: 1:ctrl:M 2:ctrl:M 1:treat:M 2:treat:M 1:ctrl:F...
** 因子の水準属性 levels() [#n81baf0a]
関数 levels() は因子の水準属性を与え,また変更することに...
書式: levels(x), levels(x) <- value
引数: x 因子オブジェクト
value levels(x)に対する適正な値
> x <- gl(2, 4, 8)
> levels(x)[1] <- "low"
> levels(x)[2] <- "high"
> x
[1] low low low low high high high high
Levels: low high
> y <- gl(2, 4, 8)
> levels(y) <- c("low", "high")
> y
[1] low low low low high high high high
Levels: low high
> z <- gl(3, 2, 12)
> levels(z) <- c("A", "B", "A")
> z
[1] A A B B A A A A B B A A
Levels: A B
> z <- gl(3, 2, 12)
> levels(z) <- list(A = c(1, 3), B = 2)
> z
[1] A A B B A A A A B B A A
Levels: A B
因子の水準属性を変更するには添え字指定で置換する
> w <- gl(3, 2, 12)
> levels(w) <- c("A", "B", "C")
> w
[1] A A B B C C A A B B C C
Levels: A B C
> levels(w)[2:3] <- "B"
> w
[1] A A B B B B A A B B B B
Levels: A B
** 因子の水準数 nlevels() [#d3f897e6]
nlevels(x) は因子 x の水準数を与える.
> nlevels(gl(3, 7))
[1] 3
** 因子の添字操作 [#lc19e202]
鈎括弧演算子による添字操作で,因子の一部の取り出し,置き...
書式: x[..., drop = FALSE], x[[i]], x[...] <- value
引数: x 因子
...,i 範囲を指定する添字集合
drop もしTRUEならば使われていない水準は取り除かれる
value 水準を表す文字列集合
> (ff <- factor(substring("statistics", 1:10, 1:10), lev...
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[1:3] # 一重鈎括弧演算子
[1] s t a
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[[3]] # 二重鈎括弧演算子では...
[1] a
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[1:3] <- c("f","a","n") # 成分の置き換え
> ff
[1] f a n t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[, drop = TRUE] # 使われていない水準を...
[1] f a n i s t i c s
Levels: a c f i n s t
** 因子水準の並べ変え reorder() ,relevel(),factor(x, le...
reorder() は総称的関数で,その因子メソッド関数は因子を第2...
並べ変える.
書式: reorder(x, ...)
## クラスfactorに対するS3メソッド
reorder(x, X, FUN = mean, ..., order = is.ordere...
引数: x 水準の順序を変更したい(順序)因子
X xと同じ長さのベクトルで,xの各水準に対応する...
FUN 最初の引数がベクトルでスカラー値を返す関数.x...
... FUNに渡されるオプション引数
order 論理値.返り値を単なる因子でなく順序つき因子...
因子 x の値で決まるグループに対応する X の部分集合に FUN ...
因子 x の順序が並べ変えられる.FUN を適用した値が score ...
> str(InsectSprays) # 組み込...
'data.frame': 72 obs. of 2 variables:
$ count: num 10 7 20 14 14 12 10 23 17 20 ...
$ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1...
> InsectSprays$spray # 因子sp...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[39] D D D D D D D D D D E E E E E E E E E E E E F F F F...
Levels: A B C D E F
## 因子水準A,B,C,D,E,F毎にcount値の中央値を計算し,それ...
> reorder(InsectSprays$spray, InsectSprays$count ,median...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[39] D D D D D D D D D D E E E E E E E E E E E E F F F F...
attr(,"scores")
A B C D E F
14.0 16.5 1.5 5.0 3.0 15.0 # 計算さ...
Levels: C E D A F B # 並べか...
relevel()では、refに選んだ因子水準を先頭に持って来る。
contrastsの基準を任意の因子にしたい場合。
> relevel(InsectSprays$spray, ref="F") # 水準F...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[35] C C D D D D D D D D D D D D E E E E E E E E E E E E...
[69] F F F F
Levels: F A B C D E
levels パラメータで因子水準の並び順を任意に指定する。
> factor(InsectSprays$spray, levels=c("A", "E", "B", "C"...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[35] C C D D D D D D D D D D D D E E E E E E E E E E E E...
[69] F F F F
Levels: A E B C D F
** 空の因子レベルを除く [#kd9e29bc]
subsetを使ってデータセットの一部を取り出すと、以下のよう...
> IS2<-subset(InsectSprays,InsectSprays$spray!="D")
> IS2$spray
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[31] C C C C C C E E E E E E E E E E E E F F F F F F F F...
Levels: A B C D E F
> summary(IS2$spray)
A B C D E F
12 12 12 0 12 12
> IS2$spray<-droplevels(IS2$spray)
> summary(IS2$spray)
A B C E F
12 12 12 12 12
** Tips 1. 因子の操作は時間がかかる [#xae6fa0f]
因子は,数値・文字列ベクトルを水準集合という文字列ベクト...
これにより,同じ値が自動的にグループ化される.こうした間...
処理にかかる可能性があるため,場合によれば元のベクトルの...
> y <- sample(1:10,1e4, replace=TRUE)
> x <- as.factor(y) # 因子化
## 処理速度比は108:1
> for (i in 1:1e4) x[i]
> for (i in 1:1e4) y[i]
逆に order(), sort() 関数等,グループ単位で処理可能な処理...
## 処理速度は3.6:3.7(秒)
> for (n in 1:1000) order(x)
> for (n in 1:1000) order(y)
データフレームは因子変数を含むことが多く,これが一層の処...
> z <- data.frame(x=runif(1e3), y=sample(letters[1:10], ...
> str(z$y) # y変...
Factor w/ 10 levels "a","b","c","d",..: 8 6 2 8 8 10 5 ...
> zz <- transform(z, y=levels(z$y)[z$y]) # y変...
> z4 <- levels(z$y)[z$y] # y変...
## 処理速度2.4:1.1:1
> for(n in 1:1e3) which(z$y == "a")
> for(n in 1:1e3) which(zz$y == "a")
> for(n in 1:1e3) which(z4 == "a")
** Tips 2. データフレーム中の文字列変数は既定では因子化さ...
> x <- data.frame(a=1:10, b=letters[1:10])
> str(x$b) # 文字列変数 b は因子化されている
Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8...
> xx <- data.frame(a=1:10, b=I(letters[1:10])) # 因子化...
> str(xx$b)
Class 'AsIs' chr [1:10] "a" "b" "c" "d" ...
> x <- transform(x, b=levels(b)[b]) # もし後から非因子...
## もし数値ならば as.numeric(levels(b))[b] とする
> str(x$b)
chr [1:10] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
** Tips 3. read.table() 関数の as.is 引数の利用 [#he1d3...
read.table() 関数でファイルをデータフレームに読みこむ際,...
> xx <- data.frame(a=1:10, b=I(letters[1:10]), c=I(LETTE...
> write.table(xx, "test.table") # テスト用データファイル
> str(read.table("test.table")) # 既定では b.c 変数は因...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
> str(read.table("test.table", as.is=c(TRUE,TRUE))) # b....
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: chr "a" "b" "c" "d" ...
$ c: chr "A" "B" "C" "D" ...
> str(read.table("test.table", as.is=c(TRUE,FALSE))) # ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: chr "a" "b" "c" "d" ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
> str(read.table("test.table", as.is=c(FALSE,TRUE))) # ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: chr "A" "B" "C" "D" ...
> str(read.table("test.table", as.is=c(FALSE,FALSE))) ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
** Tips 4. いくつかややこしい例 [#ld0c36d6]
因子変数の実際の値は水準セットと因子値の双方で決まる。水...
> set.seed(1); x <- sample(letters[1:5], 10, replace=TRUE)
> x
[1] "b" "b" "c" "e" "b" "e" "e" "d" "d" "a"
> y <- as.factor(x)
> y
[1] b b c e b e e d d a
Levels: a b c d e
> x == y # 比較、一致
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> levels(y) <- rev(levels(y))
> y # 因子水準を逆転
[1] d d c a d a a b b e
Levels: e d c b a
> x == y # もう一度比較。不一致
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FAL...
> levels(y) <- 1:5 # 更に変更
> y
[1] 2 2 3 5 2 5 5 4 4 1
Levels: 1 2 3 4 5
水準セットは冗長な要素を含んでいても良い。二つの因子変数...
> x <- y <- as.factor(c("a","b","a","a","b","a","b"))
> x
[1] a b a a b a b
Levels: a b
> levels(y) <- c("a","b","c") #
> y
[1] a b a a b a b
Levels: a b c
> x == y
以下にエラーOps.factor(x, y) : 因子の水準セットが異なっ...
**library(foreign)のread.xlsで文字列が因子になって困った...
少し毛色が違う問題ですが、エクセルからread.xlsでデータを...
#dfという名前のdata frameのIDという変数が因子になってし...
df$ID<- as.character(df$ID)
- read.xls は ... 引数を持っており,その説明を読めば,読...
たいていのことは,それを実現するための引数が用意されてい...
stringsAsFactors --- logical: should character vectors be...
~
as.is --- the default behavior of read.table is to conver...
Note: to suppress all conversions including those of nume...
~
Note that as.is is specified per column (not per variable...
~
colClasses --- character. A vector of classes to be assum...
Possible values are NA (the default, when type.convert is...
~
Note that colClasses is specified per column (not per var...
終了行:
// 2007.8.31 間瀬
SIZE(20){COLOR(blue){因子 Tips 大全}}
前置き:初級Q&Aでデータフレーム中の因子変数の件で悩まれて...
Rの因子(factor)は整数値ベクトルの一種類と考えられるが,そ...
より間接的に表現される.結果として、同じ値を持つケースが...
因子は統計モデル関数で特に重要(help(contrasts)参照)になる.
** ベクトルを因子にする factor() [#bd9f5f1f]
関数 factor() はベクトルを因子にする.Sとの互換性のために...
データフレーム等を操作する関数の内部で,変数を因子化する...
書式: factor(x = character(), levels = sort(unique.defau...
labels = levels, exclude = NA, ordered = is...
is.factor(x), is.ordered(x), as.factor(x), as.orde...
引数: x データのベクトル.普通小数の異なる値を持つ
levels オプション.xが持ち得る値のベクトル.既定で...
labels 水準に対するオプションのラベル,もしくは長...
exclude 水準を作る際除かれる値のベクトル.xと同じ型...
ordered 水準は与えられた順番で順序つけられているか...
もし ordered = TRUE ならば因子水準は順序つけられていると...
違いであるが,モデル当てはめ関数等では全く異なった扱いが...
levels[j] に 等しければ x[i] の水準は j とされる.exclude...
ない.水準値集合 levels は既定でデータ値から決まるが,も...
NA とされる.数値 x に対し exclude=NULL とすると NA 値は...
値とされる.
返り値はクラス属性 "factor" を持つオブジェクトで,属性 "l...
モード character を持つ x と同じ長さの整数値コードの集合...
順序つけられた場合はクラス属性 c("ordered", "factor") を...
因子の実際の解釈はコードと水準集合双方に依存する.水準集...
因子の比較には as.numeric(levels(f))[f] で数値ベクトル化...
勧められる.因子水準は既定でソートされるが,ソートはロケ...
例え小数でも同じ値が頻繁に繰り返されている文字列データは...
量が減る.32ビット機では n バイトの文字列の保管には 28 + ...
バイトが必要だが,因子であれば4バイトで済む.64ビット機で...
> (ff <- factor(substring("statistics",1:10,1:10), level...
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> as.integer(ff)
[1] 19 20 1 20 9 19 20 9 3 19
> factor(ff) # 水準集合...
[1] s t a t i s t i c s
Levels: a c i s t
> factor(letters[1:20], label = "letter") # 水準名の...
[1] letter1 letter2 letter3 letter4 letter5 letter...
[9] letter9 letter10 letter11 letter12 letter13 letter...
[17] letter17 letter18 letter19 letter20
20 Levels: letter1 letter2 letter3 letter4 letter5 lette...
> (x <- factor(c(1, 2, "NA"), exclude = "")) # NAを水準...
[1] 1 2 NA
Levels: 1 2 NA
**水準パターンを与えて因子を作る gl() [#j0d5278d]
関数 gl() は水準パターンを与えて因子を作る.
書式: gl(n, k, length = n*k, labels = 1:n, ordered = FAL...
引数: n 水準数
k 繰り返し数
length 結果の長さ
labels 水準に対するオプションラベル
ordered 論理値.水準は順序つけられているとみなすか?
> gl(2, 8, label = c("Control", "Treat"))
[1] Control Control Control Control Control Control Con...
[10] Treat Treat Treat Treat Treat Treat Tre...
Levels: Control Treat
> gl(2, 1, 20)
[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
Levels: 1 2
> gl(2, 2, 20)
[1] 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
Levels: 1 2
** 組合せ因子を作る interaction() [#r7c2f10e]
関数 interaction() は複数因子の水準の組合せからなる因子を...
書式: interaction(..., drop = FALSE, sep = ".")
引数: ... 複数の因子,もしくはそれらのリスト
drop もしTRUEなら,使われていない水準は除かれる.既...
sep それらを結合して新しい水準ラベルを作る文字列
結果は常に順序つけられない.水準ラベルは元の水準ラベルを...
結合したものになる.
> a <- gl(2, 4, 8)
> b <- gl(2, 2, 8, label = c("ctrl", "treat"))
> s <- gl(2, 1, 8, label = c("M", "F"))
> interaction(a, b)
[1] 1.ctrl 1.ctrl 1.treat 1.treat 2.ctrl 2.ctrl 2.tr...
Levels: 1.ctrl 2.ctrl 1.treat 2.treat
> interaction(a, b, s, sep = ":") # 分離記号を変える
[1] 1:ctrl:M 1:ctrl:F 1:treat:M 1:treat:F 2:ctrl:M 2:...
[8] 2:treat:F
8 Levels: 1:ctrl:M 2:ctrl:M 1:treat:M 2:treat:M 1:ctrl:F...
** 因子の水準属性 levels() [#n81baf0a]
関数 levels() は因子の水準属性を与え,また変更することに...
書式: levels(x), levels(x) <- value
引数: x 因子オブジェクト
value levels(x)に対する適正な値
> x <- gl(2, 4, 8)
> levels(x)[1] <- "low"
> levels(x)[2] <- "high"
> x
[1] low low low low high high high high
Levels: low high
> y <- gl(2, 4, 8)
> levels(y) <- c("low", "high")
> y
[1] low low low low high high high high
Levels: low high
> z <- gl(3, 2, 12)
> levels(z) <- c("A", "B", "A")
> z
[1] A A B B A A A A B B A A
Levels: A B
> z <- gl(3, 2, 12)
> levels(z) <- list(A = c(1, 3), B = 2)
> z
[1] A A B B A A A A B B A A
Levels: A B
因子の水準属性を変更するには添え字指定で置換する
> w <- gl(3, 2, 12)
> levels(w) <- c("A", "B", "C")
> w
[1] A A B B C C A A B B C C
Levels: A B C
> levels(w)[2:3] <- "B"
> w
[1] A A B B B B A A B B B B
Levels: A B
** 因子の水準数 nlevels() [#d3f897e6]
nlevels(x) は因子 x の水準数を与える.
> nlevels(gl(3, 7))
[1] 3
** 因子の添字操作 [#lc19e202]
鈎括弧演算子による添字操作で,因子の一部の取り出し,置き...
書式: x[..., drop = FALSE], x[[i]], x[...] <- value
引数: x 因子
...,i 範囲を指定する添字集合
drop もしTRUEならば使われていない水準は取り除かれる
value 水準を表す文字列集合
> (ff <- factor(substring("statistics", 1:10, 1:10), lev...
[1] s t a t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[1:3] # 一重鈎括弧演算子
[1] s t a
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[[3]] # 二重鈎括弧演算子では...
[1] a
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[1:3] <- c("f","a","n") # 成分の置き換え
> ff
[1] f a n t i s t i c s
Levels: a b c d e f g h i j k l m n o p q r s t u v w x ...
> ff[, drop = TRUE] # 使われていない水準を...
[1] f a n i s t i c s
Levels: a c f i n s t
** 因子水準の並べ変え reorder() ,relevel(),factor(x, le...
reorder() は総称的関数で,その因子メソッド関数は因子を第2...
並べ変える.
書式: reorder(x, ...)
## クラスfactorに対するS3メソッド
reorder(x, X, FUN = mean, ..., order = is.ordere...
引数: x 水準の順序を変更したい(順序)因子
X xと同じ長さのベクトルで,xの各水準に対応する...
FUN 最初の引数がベクトルでスカラー値を返す関数.x...
... FUNに渡されるオプション引数
order 論理値.返り値を単なる因子でなく順序つき因子...
因子 x の値で決まるグループに対応する X の部分集合に FUN ...
因子 x の順序が並べ変えられる.FUN を適用した値が score ...
> str(InsectSprays) # 組み込...
'data.frame': 72 obs. of 2 variables:
$ count: num 10 7 20 14 14 12 10 23 17 20 ...
$ spray: Factor w/ 6 levels "A","B","C","D",..: 1 1 1 1...
> InsectSprays$spray # 因子sp...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[39] D D D D D D D D D D E E E E E E E E E E E E F F F F...
Levels: A B C D E F
## 因子水準A,B,C,D,E,F毎にcount値の中央値を計算し,それ...
> reorder(InsectSprays$spray, InsectSprays$count ,median...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[39] D D D D D D D D D D E E E E E E E E E E E E F F F F...
attr(,"scores")
A B C D E F
14.0 16.5 1.5 5.0 3.0 15.0 # 計算さ...
Levels: C E D A F B # 並べか...
relevel()では、refに選んだ因子水準を先頭に持って来る。
contrastsの基準を任意の因子にしたい場合。
> relevel(InsectSprays$spray, ref="F") # 水準F...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[35] C C D D D D D D D D D D D D E E E E E E E E E E E E...
[69] F F F F
Levels: F A B C D E
levels パラメータで因子水準の並び順を任意に指定する。
> factor(InsectSprays$spray, levels=c("A", "E", "B", "C"...
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[35] C C D D D D D D D D D D D D E E E E E E E E E E E E...
[69] F F F F
Levels: A E B C D F
** 空の因子レベルを除く [#kd9e29bc]
subsetを使ってデータセットの一部を取り出すと、以下のよう...
> IS2<-subset(InsectSprays,InsectSprays$spray!="D")
> IS2$spray
[1] A A A A A A A A A A A A B B B B B B B B B B B B C C...
[31] C C C C C C E E E E E E E E E E E E F F F F F F F F...
Levels: A B C D E F
> summary(IS2$spray)
A B C D E F
12 12 12 0 12 12
> IS2$spray<-droplevels(IS2$spray)
> summary(IS2$spray)
A B C E F
12 12 12 12 12
** Tips 1. 因子の操作は時間がかかる [#xae6fa0f]
因子は,数値・文字列ベクトルを水準集合という文字列ベクト...
これにより,同じ値が自動的にグループ化される.こうした間...
処理にかかる可能性があるため,場合によれば元のベクトルの...
> y <- sample(1:10,1e4, replace=TRUE)
> x <- as.factor(y) # 因子化
## 処理速度比は108:1
> for (i in 1:1e4) x[i]
> for (i in 1:1e4) y[i]
逆に order(), sort() 関数等,グループ単位で処理可能な処理...
## 処理速度は3.6:3.7(秒)
> for (n in 1:1000) order(x)
> for (n in 1:1000) order(y)
データフレームは因子変数を含むことが多く,これが一層の処...
> z <- data.frame(x=runif(1e3), y=sample(letters[1:10], ...
> str(z$y) # y変...
Factor w/ 10 levels "a","b","c","d",..: 8 6 2 8 8 10 5 ...
> zz <- transform(z, y=levels(z$y)[z$y]) # y変...
> z4 <- levels(z$y)[z$y] # y変...
## 処理速度2.4:1.1:1
> for(n in 1:1e3) which(z$y == "a")
> for(n in 1:1e3) which(zz$y == "a")
> for(n in 1:1e3) which(z4 == "a")
** Tips 2. データフレーム中の文字列変数は既定では因子化さ...
> x <- data.frame(a=1:10, b=letters[1:10])
> str(x$b) # 文字列変数 b は因子化されている
Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8...
> xx <- data.frame(a=1:10, b=I(letters[1:10])) # 因子化...
> str(xx$b)
Class 'AsIs' chr [1:10] "a" "b" "c" "d" ...
> x <- transform(x, b=levels(b)[b]) # もし後から非因子...
## もし数値ならば as.numeric(levels(b))[b] とする
> str(x$b)
chr [1:10] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
** Tips 3. read.table() 関数の as.is 引数の利用 [#he1d3...
read.table() 関数でファイルをデータフレームに読みこむ際,...
> xx <- data.frame(a=1:10, b=I(letters[1:10]), c=I(LETTE...
> write.table(xx, "test.table") # テスト用データファイル
> str(read.table("test.table")) # 既定では b.c 変数は因...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
> str(read.table("test.table", as.is=c(TRUE,TRUE))) # b....
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: chr "a" "b" "c" "d" ...
$ c: chr "A" "B" "C" "D" ...
> str(read.table("test.table", as.is=c(TRUE,FALSE))) # ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: chr "a" "b" "c" "d" ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
> str(read.table("test.table", as.is=c(FALSE,TRUE))) # ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: chr "A" "B" "C" "D" ...
> str(read.table("test.table", as.is=c(FALSE,FALSE))) ...
'data.frame': 10 obs. of 3 variables:
$ a: int 1 2 3 4 5 6 7 8 9 10
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 ...
$ c: Factor w/ 10 levels "A","B","C","D",..: 1 2 3 4 5 ...
** Tips 4. いくつかややこしい例 [#ld0c36d6]
因子変数の実際の値は水準セットと因子値の双方で決まる。水...
> set.seed(1); x <- sample(letters[1:5], 10, replace=TRUE)
> x
[1] "b" "b" "c" "e" "b" "e" "e" "d" "d" "a"
> y <- as.factor(x)
> y
[1] b b c e b e e d d a
Levels: a b c d e
> x == y # 比較、一致
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> levels(y) <- rev(levels(y))
> y # 因子水準を逆転
[1] d d c a d a a b b e
Levels: e d c b a
> x == y # もう一度比較。不一致
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FAL...
> levels(y) <- 1:5 # 更に変更
> y
[1] 2 2 3 5 2 5 5 4 4 1
Levels: 1 2 3 4 5
水準セットは冗長な要素を含んでいても良い。二つの因子変数...
> x <- y <- as.factor(c("a","b","a","a","b","a","b"))
> x
[1] a b a a b a b
Levels: a b
> levels(y) <- c("a","b","c") #
> y
[1] a b a a b a b
Levels: a b c
> x == y
以下にエラーOps.factor(x, y) : 因子の水準セットが異なっ...
**library(foreign)のread.xlsで文字列が因子になって困った...
少し毛色が違う問題ですが、エクセルからread.xlsでデータを...
#dfという名前のdata frameのIDという変数が因子になってし...
df$ID<- as.character(df$ID)
- read.xls は ... 引数を持っており,その説明を読めば,読...
たいていのことは,それを実現するための引数が用意されてい...
stringsAsFactors --- logical: should character vectors be...
~
as.is --- the default behavior of read.table is to conver...
Note: to suppress all conversions including those of nume...
~
Note that as.is is specified per column (not per variable...
~
colClasses --- character. A vector of classes to be assum...
Possible values are NA (the default, when type.convert is...
~
Note that colClasses is specified per column (not per var...
ページ名: