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

⚡ スマートサマリー

apply()、lapply()、sapply()、tapply()は、Rのapply関数群を構成し、明示的なループに代わるベクトル化された方法で、選択した関数を行列、リスト、ベクトル、およびグループ化されたデータに適用して、簡潔な結果を返します。

  • 🔲 適用する(): 行列の行または列に対して関数を実行します。
  • ???? lapply(): リストの各要素に関数を適用し、リストを返します。
  • 📊 適用(): lapply() と同様ですが、出力をベクトルに簡略化します。
  • 🗂️ tapply(): 係数によって定義されたグループに関数を適用します。
  • 🤖 AI 支援: AIは、遅いループよりもベクトル化された適用コードの方が優れていると示唆する。

R言語での apply、lapply、sapply、tapply の使い方

このチュートリアルは、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

最低速度を測定して停止することができますping 自動車データセットからの自動車の距離。

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

よくあるご質問

apply関数は必ずしもforループより速いとは限りません。主な利点は、簡潔で読みやすいコードになることです。ベクトル全体に対するベクトル化された演算は、通常、どちらよりも高速です。

vapply() は sapply() と同様に動作しますが、安全性のために戻り値の型を強制します。一方、mapply() は複数のベクトルに一度に関数を適用する多変数バージョンです。

どちらもリストまたはベクトルの各要素に関数を適用します。lapply() は常にリストを返しますが、sapply() は可能な場合は結果をベクトルに単純化します。

はい。AIアシスタントは、ループをapplyまたはsapply呼び出しに変換したり、データに適した関数を提案したり、MARGINやFUNなどの引数を説明したりすることができます。

AIツールはRコードを生成し、ベクトル化された適用関数を推奨し、エラーを検出し、結果を要約します。ping アナリストは、より少ないバグで、より迅速にデータフレームを処理できるようになります。