第5章 tidyverse(dplyr)で再現 ・ ノック 78 / 100 ・ [[000 - はじめに(使い方と目次)|目次]]<br>
← 前 [[077 - 条件で値を振り分ける]] ・ 次 → [[079 - 二つの表をつなぐ]]
> [!info] across() は複数列に同じ関数を一括で適用します
> **`across()`**(アクロス)は、「複数の列に対して同じ関数を繰り返し適用する」ための仕組みです。`summarise()` や `mutate()` の中で使います。`across(where(is.numeric), mean)` と書くと「数値型のすべての列に `mean()` を適用する」という意味になります。
>
> `where(is.numeric)` の `where()` は「条件に合う列を選ぶ」セレクター関数で、`is.numeric` は「数値型かどうか」を判定します。Rベースでは `sapply(iris[, 1:4], mean)` のように列の範囲を手動で指定していましたが、`across(where(is.numeric), mean)` と書くと「数値列すべてに mean を当てる」という意図が明確に伝わります。
## 問題
`iris` の数値列(4列)すべての平均値を `summarise()` と `across()` を使って一度に求めてみましょう。
> [!tip] ヒント
> `summarise(across(where(is.numeric), mean))` の形で書きます。`where(is.numeric)` が「数値の列すべて」を選んでくれます。
> [!success]- 回答を見る
> ```r
> library(dplyr)
> iris %>% summarise(across(where(is.numeric), mean))
> ```
> ```
> Sepal.Length Sepal.Width Petal.Length Petal.Width
> 1 5.843333 3.057333 3.758 1.199333
> ```
> Rベースでは `sapply(iris[, 1:4], mean)` と書いていましたが、`across(where(is.numeric), mean)` を使うと列番号を指定せず「数値列すべて」とまとめて指定できます。