はだだだだ

定食にサラダは不要だと思う。

MENU

RのI関数について(AsIs関数)

RのI関数について調べましたので、備忘メモです。

  • 読みはAsIs関数
  • 主な使い方は以下3つ
  1. data.frameでベクトルをデータフレームにするときに、文字列をfactor型に変換させない。
  2. formulaを書くときに、算術演算子をformulaの記法と認識させない。
  3. 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")

f:id:hadadada00:20190603000238p:plain

以下のように"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")

f:id:hadadada00:20190603000409p:plain

I()を使用することでaestheticsを指定したことになります。

n <- 10^6
income <- 10^(rnorm(n, log10(45000), log10(3)))
qplot(log10(income), bins = 30, color = I("black"))

f:id:hadadada00:20190603000543p:plain