apply()、lapply()、sapply()、tapply() R の関数と例

このチュートリアルは、apply() 関数コレクションを紹介することを目的としています。 apply() 関数は、すべてのコレクションの中で最も基本的な関数です。 sapply()、lapply()、tapply() についても学習します。 apply コレクションはループの代わりとして見ることができます。

apply() コレクションは以下にバンドルされています。 必須 パッケージの場合 Anaconda で R をインストールするR 関数の apply には、オブジェクトのコレクション (データ フレーム、リスト、ベクターなど) に対して冗長なアプリケーションを実行するために、多くの関数をフィードできます。apply() の主な目的は、ループ構造の明示的な使用を避けることです。入力リスト、行列、または配列に使用して、関数を適用できます。apply() には任意の関数を渡すことができます。

apply() 関数

apply() データ フレームまたは行列を入力として受け取り、ベクトル、リスト、または配列で出力します。 適用する Rの関数 主にループ構造の明示的な使用を避けるために使用されます。これは、行列に使用できるすべてのコレクションの中で最も基本的なものです。

この関数は 3 つの引数を取ります。

apply(X, MARGIN, FUN)
Here:
-x: an array or matrix
-MARGIN:  take a value or range between 1 and 2 to define where to apply the function:
-MARGIN=1`: the manipulation is performed on rows
-MARGIN=2`: the manipulation is performed on columns
-MARGIN=c(1,2)` the manipulation is performed on rows and columns
-FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>

最も単純な例は、すべての列の行列を合計することです。 コード apply(m1, 2, sum) は、sum 関数を行列 5×6 に適用し、データセット内でアクセス可能な各列の合計を返します。

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

出力:

R の apply() 関数の例
R の apply() 関数の例

ベスト プラクティス: コンソールに出力する前に値を保存します。

lapply() 関数

ラップ() 関数はリスト オブジェクトに対する操作を実行するのに役立ち、元のセットと同じ長さのリスト オブジェクトを返します。lappy() は、入力リスト オブジェクトと同じ長さのリストを返します。リストの各要素は、リストの対応する要素に FUN を適用した結果です。R の Lapply は、リスト、ベクトル、またはデータ フレームを入力として受け取り、リストに出力します。

lapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x	

lagply() の l はリストを表します。 lagply() と apply() の違いは、出力の戻り値の間にあります。 lagply() の出力はリストです。 lagply() は、データ フレームやリストなどの他のオブジェクトにも使用できます。

lagply() 関数には MARGIN は必要ありません。

非常に簡単な例としては、to lower 関数を使用して行列の文字列値を小文字に変更することができます。 有名な映画の名前でマトリックスを構築します。 名前は大文字形式です。

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)

出力:

## List of 4
## $:chr"spyderman"
## $:chr"batman"
## $:chr"vertigo"
## $:chr"chinatown"

unlist() を使用してリストをベクトルに変換できます。

movies_lower <-unlist(lapply(movies,tolower))
str(movies_lower)

出力:

##  chr [1:4] "spyderman" "batman" "vertigo" "chinatown"

sapply() 関数

適用() 関数はリスト、ベクトル、またはデータ フレームを入力として受け取り、ベクトルまたはデータ フレームで出力します。 マトリックスこれはリスト オブジェクトの操作に役立ち、元のセットと同じ長さのリスト オブジェクトを返します。R の Sapply 関数は lapply() 関数と同じ機能を果たしますが、ベクトルを返します。

sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x

車のデータセットから車の最低速度と停止距離を測定できます。

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars

出力:

## $speed
## [1] 4
## $dist
## [1] 2
smn_cars

出力:

## speed  dist 
##     4     2
lmxcars <- lapply(dt, max)
smxcars <- sapply(dt, max)
lmxcars

出力:

## $speed
## [1] 25
## $dist
## [1] 120
smxcars

出力:

## speed  dist 
##    25   120

lapply() または sapply() にユーザー組み込み関数を使用できます。ベクトルの最小値と最大値の平均を計算するために、avg という関数を作成します。

avg <- function(x) {  
  ( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars

出力

## speed  dist
##  14.5  61.0

sapply() は値を直接ベクトルに格納するため、R の sapply は、返される出力において、lapply() よりも効率的です。 次の例では、これが常に当てはまるわけではないことがわかります。

apply()、sapply()、`lapply() の違いを次の表にまとめます。

演算 Arguments DevOps Tools Engineer試験のObjective 入力 出力
適用する apply(x, MARGIN, FUN) 行または列、あるいはその両方に関数を適用します。 データフレームまたはマトリックス ベクトル、リスト、配列
ラッププライ ラップリ(X、FUN) 入力のすべての要素に関数を適用します。 リスト、ベクター、またはデータ フレーム リスト
適用する 適用(X, FUN) 入力のすべての要素に関数を適用します。 リスト、ベクター、またはデータ フレーム ベクトルまたは行列

スライスベクトル

データ フレームをスライスするには、互換性のあるラップリー() または sapply() を使用できます。 数値のベクトルを受け取り、厳密に平均を超える値のみを含むベクトルを返す関数 Below_average() を作成します。 両方の結果を Identity() 関数で比較します。

below_ave <- function(x) {  
    ave <- mean(x) 
    return(x[x > ave])
}
dt_s<- sapply(dt, below_ave)
dt_l<- lapply(dt, below_ave)
identical(dt_s, dt_l)

出力:

## [1] TRUE

タップリ()関数

タップリ() ベクトル内の各因子変数のメジャー (平均、中央値、最小、最大など) または関数を計算します。 これは、ベクトルのサブセットを作成し、各サブセットにいくつかの関数を適用できる非常に便利な関数です。

tapply(X, INDEX, FUN = NULL)
Arguments:
-X: An object, usually a vector
-INDEX: A list containing factor
-FUN: Function applied to each element of x

データ サイエンティストや研究者の仕事の 1 つは、変数の要約を計算することです。たとえば、平均を測定したり、特性に基づいてデータをグループ化したりします。ほとんどのデータは、ID、都市、国などでグループ化されています。グループごとに要約すると、より興味深いパターンが明らかになります。

その仕組みを理解するために、iris データセットを使用してみましょう。 このデータセットは機械学習の世界では非常に有名です。 このデータセットの目的は、XNUMX つの花種 (セパル、バーシカラー、バージニカ) のそれぞれのクラスを予測することです。 データセットは、種ごとに長さと幅に関する情報を収集します。

事前の作業として、各種の長さの中央値を計算できます。 R の Taply は、この計算を簡単に実行する方法です。

data(iris)
tapply(iris$Sepal.Width, iris$Species, median)

出力:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0