FACTOR型の注意点
Hiroki. K
Factor型について
 水準(Levels)がある変数
 デフォルト設定でData.Frameをつくる場合、文字列はFactorとなる
(例) > ans <- data.frame(result=c('yes', 'no', 'yes'))
> str(ans)
'data.frame': 3 obs. of 1 variable:
$ result: Factor w/ 2 levels "no","yes": 2 1 2
水準(Levels) 順位
no 1
yes 2
result
1
2
1
ans =
Factor型の操作が必要になる場合
 水準を任意の順に設定する(デフォルトはアルファベット順)
例1: yes、noの順になるようにData.Frameをつくる
> ans <- data.frame(result=c('yes', 'no', 'yes'), levels=('yes', 'no'))
> str(ans)
'data.frame': 3 obs. of 1 variable:
$ result: Factor w/ 2 levels “yes",“no": 1 2 1
【準備】以降で使うデータ①
#サンプルデータ: 1週間の曜日と値
> set.seed(123)
> data <- data.frame(day = c('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'),
val = rnorm(7))
> str(data)
'data.frame': 7 obs. of 2 variables:
$ day: Factor w/ 7 levels "fri","mon","sat",..: 2 6 7 5 1 3 4
$ val: num 0.78 1.456 -0.644 -1.553 -1.598 ...
【準備】以降で使うデータ②
#サンプルデータ: 数値にエラーが入る場合
> data$valError <- c('error', data$val[-1])
> str(data)
'data.frame': 7 obs. of 4 variables:
$ day: Factor w/ 7 levels "fri","mon","sat",..: 2 6 7 5 1 3 4
$ val: num 0.62 0.612 -0.162 0.812 2.197 ...
$ daySorted: Factor w/ 7 levels "mon","tue","wed",..: 1 2 3 4 5 6 7
$ valError: chr "error" "0.612123492650849" "-0.162310976918126" ...
【準備】以降で使うデータ③
#サンプルデータ: 曜日の水準の並べ替え⇒曜日順にする
> data$daySorted <- factor(data$day, levels=data$day)
#data$daySorted <- factor(data$day, levels=c(‘mon’, ‘tue’, ‘wed’, ‘thu’, ‘fri’, ‘sat’, ‘sun’))と同じ
> str(data)
'data.frame': 7 obs. of 4 variables:
$ day: Factor w/ 7 levels "fri","mon","sat",..: 2 6 7 5 1 3 4
$ val: num 0.62 0.612 -0.162 0.812 2.197 ...
$ daySorted: Factor w/ 7 levels "mon","tue","wed",..: 1 2 3 4 5 6 7
【準備】以降で使うデータ④
#サンプルデータ: 一旦CSVで保存して再度読み込む
> write.csv(data, 'data.csv', row.names=F)
> data1 <- read.csv('data.csv')
> data1$daySorted <- factor(data1$daySorted, levels=data1$daySorted)
> str(data1)
'data.frame': 7 obs. of 4 variables:
$ day: Factor w/ 7 levels "fri","mon","sat",..: 2 6 7 5 1 3 4
$ val: num 0.62 0.612 -0.162 0.812 2.197 ...
$ daySorted: Factor w/ 7 levels "mon","tue","wed",..: 1 2 3 4 5 6 7
$ valError: chr "error" "0.612123492650849" "-0.162310976918126" ...
【準備】以降で使うデータ⑤
#ここまでで準備したもの
day val daySorted valError
mon 0.6204 mon error
tue 0.6121 tue 0.6121
wed -0.1623 wed -0.1623
thu 0.8119 thu 0.8119
fri 2.1968 fri 2.1968
sat 2.0492 sat 2.0492
sun 1.6324 sun 1.6324
data =
保存・再読み込み
day val daySorted valError
mon 0.6204 mon error
tue 0.6121 tue 0.6121
wed -0.1623 wed -0.1623
thu 0.8119 thu 0.8119
fri 2.1968 fri 2.1968
sat 2.0492 sat 2.0492
sun 1.6324 sun 1.6324
data1 =
chr num factor chr chr num factor factor
Factorの並び替え
 デフォルトはアルファベット順
例2: dataのday, valをグラフ化
そのままグラフ化する場合:
> ggplot(data, aes(x=day, y=val)) +
geom_bar(stat='identity') +
theme_bw()
Factorの並び替え
 水準を任意の順に設定する
例3: dataのdaySorted, valをグラフ化
> ggplot(data, aes(x=day, y=valSorted)) +
geom_bar(stat='identity') +
theme_bw()
曜日順になっている ⇒
Factorに異常値が混入している場合
 まずは異常値が混入していない場合
例3: dataのdaySorted, valをグラフ化(再掲)
> ggplot(data, aes(x=day, y=valSorted)) +
geom_bar(stat='identity') +
theme_bw()
Factorに異常値が混入している場合
 次に異常値(error)が混入している場合
例4: dataのdaySorted, valErrorをグラフ化
> ggplot(data,
aes(x=daySorted,
y=as.numeric(valError))) +
geom_bar(stat='identity') +
theme_bw()
as.numericで異常値分が欠損になる(NAに強制変換)
Factorに異常値が混入している場合
 異常値(error)が混入しているデータを再読み込みする
例4: data1のdaySorted, valErrorをグラフ化
> ggplot(data1,
aes(x=daySorted,
y=as.numeric(valError))) +
geom_bar(stat='identity') +
theme_bw()
as.numericでFactorの順位が数値化されてしまう
Factorに異常値が混入している場合
data valに欠損値 保存・再読み込み data1
as.numeric(val) as.numeric(val)
そのまま数値化できない
Factorに異常値が混入している場合
data valに欠損値 保存・再読み込み data1
as.numeric(val) as.numeric(as.character(val))
一回文字列に直してから数値化

Factor型の注意点