統計プログラムRの勉強日記

Rに関して勉強してきたことを紹介します

【R】図解!関数の作り方|function関数

関数の作り方 イメージ

はじめに

この記事では自作関数の作り方を紹介したいと思います。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
 

自作関数を定義しているコードのイメージは以下の図のようになります。

自作関数イメージ(CV)

また、定義した自作関数を使っているときのイメージは次のようになります。

自作関数イメージ(CV使用編)

使用例

いくつか自作関数を作る場面の具体的な使用例を挙げてみたいと思います。

作図を関数化する

まず初めの使用例は作図する関数です。データ解析する中で一度は行うこととして作図が挙げられると思います。
ここでは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

まとめ

いかがだったでしょうか。自作関数を定義すると後でコード修正する時に色々な所を修正しなくても関数を定義した所だけ修正すれば良くなるためデバッグしやすくなります。当然コード量も少なくなりますし、慣れたら関数を作って作業を効率化しましょう!