RのI関数について(AsIs関数)
RのI関数について調べましたので、備忘メモです。
- 読みはAsIs関数
- 主な使い方は以下3つ
- data.frameでベクトルをデータフレームにするときに、文字列をfactor型に変換させない。
- formulaを書くときに、算術演算子をformulaの記法と認識させない。
- qplotでaestheticsを記述する。
data.frameでベクトルをデータフレームにするときに、文字列をfactor型に変換させない
以下のようにI()を使わないと文字列ベクトルはファクター型に変換されます。
vector <- c("apple" , "banana", "chocolate", "dog") df <- data.frame(vector) typeof(df$vector) class(df$vector) > typeof(df$vector) [1] "integer" > class(df$vector) [1] "factor"
I()関数を使うとAsIsという型に変換され、factor型にはなりません。
vector <- c("apple" , "banana", "chocolate", "dog") df_asis <- data.frame(I(vector)) typeof(df_asis$vector) class(df_asis$vector) > typeof(df_asis$vector) [1] "character" > class(df_asis$vector) [1] "AsIs"
formulaを書くときに、算術演算子をformulaの記法と認識させない。
例えばy = a + bx^2というモデルの切片aと傾きbを推定するとします。以下のようにformulaを記述するとx^2がxと解釈されてしまい上手くいきません。
y <- rnorm(100, 0, 1) x <- rnorm(100, 0, 1) df <- data.frame(cbind(y, x)) model <- lm(y ~ x^2, data = df) model > model Call: lm(formula = y ~ x^2, data = df) Coefficients: (Intercept) x -0.10504 -0.03911
これはformulaの仕様がx * xのように同じ変数が重複した場合はxとみなすようになっているためです。
これを回避するためにI()を使用します。
y <- rnorm(100, 0, 1) x <- rnorm(100, 0, 1) model_asis <- lm(y ~ I(x^2), data = df) model_asis > model_asis Call: lm(formula = y ~ I(x^2), data = df) Coefficients: (Intercept) I(x^2) -0.2434 0.1085
これでy = a + bx^2のaとbが推計されました。
qplotでaestheticsを記述する。
黒色のヒストグラムを書きたいときに以下のようにすると上手くいきません。
n <- 10^6 income <- 10^(rnorm(n, log10(45000), log10(3))) qplot(log10(income), bins = 30, color = "black")
以下のように"black"を"blue"にしても同じグラフになります。これは"black"や"blue"というaestheticsではなく、c("black")、c("blue")という要素数1のベクトルと認識されているためです。
n <- 10^6 income <- 10^(rnorm(n, log10(45000), log10(3))) qplot(log10(income), bins = 30, color = "blue")
I()を使用することでaestheticsを指定したことになります。
n <- 10^6 income <- 10^(rnorm(n, log10(45000), log10(3))) qplot(log10(income), bins = 30, color = I("black"))