はじめに
この記事では自作関数の作り方を紹介したいと思います。R初心者の方にも分かりやすいように図を使いながら説明します。関数を作ることで何度も同じ処理をする文を書かなくて良くなり、コーディング量を減らすことができるため、この機会にしっかり理解しましょう!
自作関数とは
そもそも自作関数って何?という人もいるかも知れないので説明しておきます。自作関数とは何度も同じ複雑な処理をする時にあらかじめ行う処理を定義しておくことです。簡単な処理ならわざわざ関数を作る必要がないのですが、色々な処理を組み合わせる必要がある場合はあらかじめ関数を作った方が使い回せて楽ができます。
とりあえず作ってみる
まずは簡単な関数を作ってみましょう。ここでは変動係数(CV; coefficient of variation)を計算する関数を作ってみます。
cv = function(x){ sd = sd(x) # sd関数で標準偏差を計算 mean = mean(x) # mean関数で平均値を計算 return(sd/mean) # 上で計算してきた標準偏差偏差を計算してきた平均値で割る }
ここで作った関数は以下のように使います。
set.seed(100) data = rnorm(100, sd = 1, mean = 100) # 平均100、標準偏差1の正規分布に従う値をランダムに100個取る cv(data)
出力される結果はこんな感じになります。(クリックで表示)
[1] 0.01020681
自作関数を定義しているコードのイメージは以下の図のようになります。
また、定義した自作関数を使っているときのイメージは次のようになります。
使用例
いくつか自作関数を作る場面の具体的な使用例を挙げてみたいと思います。
作図を関数化する
まず初めの使用例は作図する関数です。データ解析する中で一度は行うこととして作図が挙げられると思います。
ここではggplot2
を使うパターンを考えます。
library(tidyverse) plotFunction = function(data){ select(data, V1 = 1, V2 = 2) %>% ggplot(aes(x = V1, y = V2, fill = V1)) + geom_boxplot() + theme_bw(base_size = 18) + labs(x = "group", y = "value") + guides(fill = F) }
この関数を使う時は以下のように使います。
data = data.frame(group = c("A", "A", "A", "B", "B", "B"), value = c(10, 11, 9, 15, 18, 17)) plotFunction(data = data)
出力される結果はこんな感じになります。(クリックで表示)
統計検定までを関数化する
次は統計検定までの一連の処理を関数化する場合を考えます。
解析したいデータセットが複数ある場合は関数化してしまうのも良いでしょう。ここではデータフレームとしてインポートしたデータを前処理して解析する流れを考えてみます。
library (tidyverse) library(broom) testFunction = function(data){ tidied = data %>% gather(-1, key = "group", value = "value") %>% mutate(group = factor(group)) t.test(value~group, tidied) %>% tidy() }
この関数を使う時は以下のように使います。
data = data.frame(id = 1:5, A = rnorm(n = 5, mean = 10, sd = 1), B = rnorm(n = 5, mean = 8, sd = 1)) testFunction(data)
出力される結果はこんな感じになります。(クリックで表示)
estimate | estimate1 | estimate2 | statistic | p.value | parameter | conf.low | conf.high | method | alternative |
---|---|---|---|---|---|---|---|---|---|
2.61 | 10.6 | 7.97 | 7.512092 | 0.0007903521 | 4.799199 | 1.70455 | 3.512481 | Welch Two Sample t-test | two.sided |
まとめ
いかがだったでしょうか。自作関数を定義すると後でコード修正する時に色々な所を修正しなくても関数を定義した所だけ修正すれば良くなるためデバッグしやすくなります。当然コード量も少なくなりますし、慣れたら関数を作って作業を効率化しましょう!