R プログラミングの関数と例
Rの関数とは何ですか?
A functionは、プログラミング環境では一連の命令です。 プログラマーは回避するための関数を構築します。 を繰り返す 同じタスク、または減らす 複雑。
関数は次のようにする必要があります
- 指定されたタスクを実行するために書かれた
- 引数を含めることも含めないこともできます
- 体が入っている
- XNUMX つ以上の値を返す場合と返さない場合があります。
関数への一般的なアプローチは、引数部分を次のように使用することです。 入力、 フィード ボディ 一部を分割し、最後に返します 出力関数の構文は次のとおりです。
function (arglist) { #Function body }
R 重要な組み込み関数
R には多くの組み込み関数があります。R は、入力パラメーターと関数の引数を値または位置で照合し、関数本体を実行します。 関数の引数にはデフォルト値を指定できます。これらの引数を指定しない場合、R はデフォルト値を取得します。
注意:
コンソールで関数自体の名前を実行すると、関数のソース コードを確認できます。
XNUMX つの関数グループが実際に動作している様子を見ていきます。
- 一般的な機能
- 数学関数
- 統計関数
一般的な機能
cbind()、rbind()、range()、sort()、order() 関数などの一般的な関数については既によく知られています。これらの関数はそれぞれ特定のタスクを持ち、引数を取って出力を返します。以下は知っておくべき重要な関数です。
diff()関数
あなたが取り組んでいる場合 時系列、シリーズを固定する必要があります。 ラグ値。 A 定常プロセス 一定の平均、分散、および時間の経過に伴う自己相関が可能になります。 これにより、主に時系列の予測が改善されます。 diff() 関数を使用すると簡単に実行できます。 傾向のあるランダムな時系列データを構築し、関数 diff() を使用して系列を定常化することができます。 diff() 関数は XNUMX つの引数、ベクトルを受け入れ、適切な遅延差分と反復差分を返します。
注意: ランダムなデータを作成する必要はよくありますが、学習と比較のためには、マシン間で数値が同一である必要があります。すべてのマシンで同じデータが生成されるように、任意の値 123 を持つ set.seed() 関数を使用します。set.seed() 関数は、すべての最新のコンピューターで同じ数値シーケンスを持つようにする疑似乱数ジェネレーターのプロセスを通じて生成されます。set.seed() 関数を使用しないと、すべてのマシンで異なる数値シーケンスを持つことになります。
set.seed(123) ## Create the data x = rnorm(1000) ts <- cumsum(x) ## Stationary the serie diff_ts <- diff(ts) par(mfrow=c(1,2)) ## Plot the series plot(ts, type='l') plot(diff(ts), type='l')
length() 関数
多くの場合、私たちが知りたいのは、 長さ 計算用または for ループで使用するベクトルの長さ。length() 関数はベクトル x の行数をカウントします。次のコードは cars データセットをインポートし、行数を返します。
注意: length() はベクトル内の要素の数を返します。 関数が行列またはデータ フレームに渡される場合、列数が返されます。
dt <- cars ## number columns length(dt)
出力:
## [1] 1
## number rows length(dt[,1])
出力:
## [1] 50
波形演算
Rには数学関数の配列があります。
Operaタ | 説明 |
---|---|
abs(x) | xの絶対値を取ります |
log(x、base = y) | xを底yとする対数を取ります。 ベースが指定されていない場合、自然対数を返します |
exp(x) | xの指数を返します |
sqrt(x) | xの平方根を返します |
階乗(x) | x の階乗を返します (x!) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector)
出力:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826 ## [8] 3.951244 3.970292 3.988984 4.007333
#exponential exp(x_vector)
#squared root sqrt(x_vector)
出力:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198
#factorial factorial(x_vector)
出力:
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62 ## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71 ## [11] 1.269640e+73
統計関数
R の標準インストールには、幅広い統計関数が含まれています。 このチュートリアルでは、最も重要な機能について簡単に説明します。
基本的な統計関数
Operaタ | 説明 |
---|---|
平均(x) | xの平均 |
中央値(x) | x の中央値 |
var(x) | xの分散 |
sd(x) | xの標準偏差 |
スケール(x) | x の標準スコア (z スコア) |
分位数(x) | x の四分位数 |
概要(x) | x の概要: 平均、最小、最大など。 |
speed <- dt$speed speed # Mean speed of cars dataset mean(speed)
出力:
## [1] 15.4
# Median speed of cars dataset median(speed)
出力:
## [1] 15
# Variance speed of cars dataset var(speed)
出力:
## [1] 27.95918
# Standard deviation speed of cars dataset sd(speed)
出力:
## [1] 5.287644
# Standardize vector speed of cars dataset head(scale(speed), 5)
出力:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset quantile(speed)
出力:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset summary(speed)
出力:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
ここまでで、多くの R 組み込み関数を学習してきました。
注意注: 引数のクラス (数値、ブール値、文字列など) に注意してください。 たとえば、文字列値を渡す必要がある場合は、文字列を引用符で囲む必要があります: "ABC" 。
Rで関数を書く
場合によっては、特定のタスクを実行する必要があり、既製の関数が存在しないため、独自の関数を作成する必要があります。 ユーザー定義関数には、 名, 引数 フォルダーとその下に ボディ.
function.name <- function(arguments) { computations on the arguments some other code }
注意: ユーザー定義関数には、組み込み関数とは異なる名前を付けることをお勧めします。 混乱を避けることができます。
引数が XNUMX つの関数
次のスニペットでは、単純な二乗関数を定義します。 この関数は値を受け取り、その値の XNUMX 乗を返します。
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
コードの説明
- 関数の名前は square_function です。 好きなように呼ぶことができます。
- 引数「n」を受け取ります。 私たちは ユーザーが整数、ベクトル、または行列を渡すことができるように変数のタイプを指定しませんでした
- この関数は入力「n」を受け取り、入力の XNUMX 乗を返します。 関数の使用が完了したら、rm() 関数を使用して削除できます。
# 関数を作成した後
rm(square_function) square_function
コンソールには、関数が存在しないことを示すエラー メッセージ :Error: object 'square_function' not found が表示されます。
環境のスコープ設定
Rでは、 環境 コレクション 関数、変数、データフレームなどのオブジェクトの
R は、Rstudio が要求されるたびに環境を開きます。
利用可能なトップレベルの環境は、 地球環境、R_GlobalEnvと呼ばれます。 そして、私たちは ローカル環境。
現在の環境のコンテンツを一覧表示できます。
ls(environment())
出力
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
R_GlobalEnv で作成されたすべての変数と関数を確認できます。
上記のリストは、R Studio で実行する過去のコードに基づいて異なります。
square_function 関数の引数 n は、 この地球環境ではない.
A 新製品 機能ごとに環境を構築します。 上記の例では、関数 square_function() はグローバル環境内に新しい環境を作成します。
の違いを明確にするために、 全体的な と ローカル環境次の例を見てみましょう
これらの関数は値 x を引数として受け取り、それを関数の外側と内側で定義する y に追加します。
関数 f は出力 15 を返します。これは、y がグローバル環境で定義されているためです。 グローバル環境で定義された変数はすべてローカルで使用できます。 変数 y は、すべての関数呼び出し中に値 10 を持ち、いつでもアクセスできます。
変数 y が関数内で定義されている場合に何が起こるかを見てみましょう。
rm r を使用してこのコードを実行する前に、「y」をドロップする必要があります。
f(15) を呼び出したときの出力も 5 ですが、値 y を出力しようとするとエラーが返されます。 変数 y はグローバル環境にありません。
最後に、R は最新の変数定義を使用して関数の本体内に渡します。次の例を考えてみましょう。
関数の本体内に y 変数を明示的に作成したため、R は関数の外で定義された y 値を無視します。
複数引数関数
複数の引数を持つ関数を作成できます。 「回」と呼ばれる関数を考えてみましょう。 これは XNUMX つの変数を乗算する単純な関数です。
times <- function(x,y) { x*y } times(2,4)
出力:
## [1] 8
いつ関数を書けばよいのでしょうか?
データ サイエンティストは、多くの反復的なタスクを実行する必要があります。 ほとんどの場合、コードのチャンクを繰り返しコピーして貼り付けます。 たとえば、変数を正規化してから実行することを強くお勧めします。 機械学習 アルゴリズム。 変数を正規化する式は次のとおりです。
R で min() 関数と max() 関数を使用する方法はすでに知っています。ティブル ライブラリを使用してデータ フレームを作成します。 Tibble は、これまでのところ、データ セットを最初から作成するのに最も便利な関数です。
library(tibble) # Create a data frame data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), )
上記の関数を計算するには 1 つの手順を実行します。 最初のステップでは、c1 の再スケーリングである c1_norm という変数を作成します。 ステップ 2 では、c3_norm のコードをコピーして貼り付け、cXNUMX と cXNUMX を変更します。
列 c1 の関数の詳細:
ノミネーター: : data_frame$c1 -min(data_frame$c1))
分母: max(data_frame$c1)-min(data_frame$c1))
したがって、これらを除算して列 c1 の正規化された値を取得できます。
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
c1_norm、c2_norm、c3_norm を作成できます。
Create c1_norm: rescaling of c1 data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) # show the first five values head(data_frame$c1_norm, 5)
出力:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
それは動作します。 コピーして貼り付けることができます
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
次に、c1_norm を c2_norm に、c1 を c2 に変更します。 同じことを行って c3_norm を作成します
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2)) data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
変数 c1、c2、c3 を完全に再スケーリングしました。
ただし、この方法は間違いが起こりやすいです。 コピーして貼り付けた後に列名を変更するのを忘れる可能性があります。 したがって、同じコードを XNUMX 回以上貼り付ける必要がある場合は、そのたびに関数を作成することをお勧めします。 コードを式に再配置し、必要なときにいつでも呼び出すことができます。 独自の関数を作成するには、以下を与える必要があります。
- 名前:ノーマライズ。
- 引数の数: 必要な引数は XNUMX つだけです。これは、計算で使用する列です。
- 本体: これは単に返したい式です。
正規化関数の作成を段階的に進めていきます。
ステップ1) 作成します 推薦者、つまり 。 R では、次のようにノミネータを変数に格納できます。
nominator <- x-min(x)
ステップ2) を計算します。 分母: 。 ステップ 1 のアイデアを複製して、計算を変数に保存できます。
denominator <- max(x)-min(x)
ステップ3) 分母と分母の間で割り算を行います。
normalize <- nominator/denominator
ステップ4) 呼び出し元の関数に値を返すには、return() 内で Normalize を渡して関数の出力を取得する必要があります。
return(normalize)
ステップ5) すべてを括弧内にラップすることで、関数を使用する準備が整いました。
normalize <- function(x){ # step 1: create the nominator nominator <- x-min(x) # step 2: create the denominator denominator <- max(x)-min(x) # step 3: divide nominator by denominator normalize <- nominator/denominator # return the value return(normalize) }
変数 c1 を使用して関数をテストしてみましょう。
normalize(data_frame$c1)
完璧に機能します。 最初の関数を作成しました。
関数は、反復的なタスクを実行するためのより包括的な方法です。 以下のように、さまざまな列に対して正規化式を使用できます。
data_frame$c1_norm_function <- normalize (data_frame$c1) data_frame$c2_norm_function <- normalize (data_frame$c2) data_frame$c3_norm_function <- normalize (data_frame$c3)
この例は単純ですが、数式の力を推測することができます。 上記のコードは読みやすく、特にコードを貼り付ける際の間違いを避けることができます。
条件付き関数
場合によっては、コードが異なる出力を返せるように関数に条件を含める必要があります。
機械学習タスクでは、データセットをトレーニング セットとテスト セットに分割する必要があります。 トレイン セットにより、アルゴリズムがデータから学習できるようになります。 モデルのパフォーマンスをテストするには、テスト セットを使用してパフォーマンスの測定値を返すことができます。 R には 0.8 つのデータセットを作成する機能はありません。 それを行うための独自の関数を作成できます。 この関数は 80 つの引数を取り、split_data() と呼ばれます。 背後にある考え方は単純で、データセットの長さ (つまり、観測値の数) に 20 を掛けます。 たとえば、データセットを 100/0.8 に分割し、データセットに 100 行が含まれる場合、関数は 80*80 = XNUMX を乗算します。トレーニング データとして XNUMX 行が選択されます。
大気質データセットを使用して、ユーザー定義関数をテストします。 大気質データセットには 153 行があります。 以下のコードでそれを確認できます。
nrow(airquality)
出力:
## [1] 153
以下のように進めていきます。
split_data <- function(df, train = TRUE) Arguments: -df: Define the dataset -train: Specify if the function returns the train set or test set. By default, set to TRUE
この関数には 2 つの引数があります。引数 train はブール パラメーターです。これが TRUE に設定されている場合、関数はトレーニング データセットを作成し、それ以外の場合はテスト データセットを作成します。
Normalise() 関数と同様に続行できます。 XNUMX 回限りのコードであるかのようにコードを記述し、条件を含むすべてを本体にラップして関数を作成します。
ステップ1:
データセットの長さを計算する必要があります。 これは関数 nrow() で行われます。 Nrow は、データセット内の行の合計数を返します。 これを可変長と呼びます。
length<- nrow(airquality) length
出力:
## [1] 153
ステップ2:
長さに 0.8 を掛けます。 選択する行数を返します。 153*0.8 = 122.4 となります。
total_row <- length*0.8 total_row
出力:
## [1] 122.4
大気質データセット内の 122 行の中から 153 行を選択したいと考えています。 1 から total_row までの値を含むリストを作成します。 結果をsplitという変数に保存します。
split <- 1:total_row split[1:5]
出力:
## [1] 1 2 3 4 5
Split はデータセットから最初の 122 行を選択します。 たとえば、変数 Split が値 1、2、3、4、5 などを収集していることがわかります。 これらの値は、返す行を選択するときのインデックスになります。
ステップ3:
分割変数に格納されている値に基づいて、大気質データセット内の行を選択する必要があります。 これは次のように行われます。
train_df <- airquality[split, ] head(train_df)
出力:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 51 13 137 10.3 76 6 20 ##[3] 15 18 65 13.2 58 5 15 ##[4] 64 32 236 9.2 81 7 3 ##[5] 27 NA NA 8.0 57 5 27 ##[6] 58 NA 47 10.3 73 6 27 ##[7] 44 23 148 8.0 82 6 13
ステップ4:
残りの行 123:153 を使用してテスト データセットを作成できます。 これは、split の前に – を使用することで実行されます。
test_df <- airquality[-split, ] head(test_df)
出力:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 123 85 188 6.3 94 8 31 ##[3] 124 96 167 6.9 91 9 1 ##[4] 125 78 197 5.1 92 9 2 ##[5] 126 73 183 2.8 93 9 3 ##[6] 127 91 189 4.6 93 9 4 ##[7] 128 47 95 7.4 87 9 5
ステップ5:
関数の本体内で条件を作成できます。 列車セットを返すためにデフォルトで TRUE に設定されたブール値である引数 train があることを思い出してください。 条件を作成するには、if 構文を使用します。
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
これで関数を書くことができます。 関数を任意の環境で試したいため、airquality を df に変更するだけで済みます。 データフレーム空気の質だけではありません:
split_data <- function(df, train = TRUE){ length<- nrow(df) total_row <- length *0.8 split <- 1:total_row if (train ==TRUE){ train_df <- df[split, ] return(train_df) } else { test_df <- df[-split, ] return(test_df) } }
大気質データセットで関数を試してみましょう。 122 行のトレイン セットと 31 行のテスト セットが必要です。
train <- split_data(airquality, train = TRUE) dim(train)
出力:
## [1] 122 6
test <- split_data(airquality, train = FALSE) dim(test)
出力:
## [1] 31 6