1. ホーム
  2. r

[解決済み] dplyrを使用して、テーブルの各行に関数を適用しますか?

2022-06-20 09:14:33

質問

で作業する場合 plyr を使うのが便利だと思うことがよくありました。 adply を使うのが便利です。

など。

data(iris)
library(plyr)
head(
     adply(iris, 1, transform , Max.Len= max(Sepal.Length,Petal.Length))
    )
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1          5.1         3.5          1.4         0.2  setosa     5.1
2          4.9         3.0          1.4         0.2  setosa     4.9
3          4.7         3.2          1.3         0.2  setosa     4.7
4          4.6         3.1          1.5         0.2  setosa     4.6
5          5.0         3.6          1.4         0.2  setosa     5.0
6          5.4         3.9          1.7         0.4  setosa     5.4

今、私は dplyr を使うようになったのですが、これを整理して自然に行う方法はないでしょうか?これは ではありません。 であり、私が望むものではありません。

library(dplyr)
head(
     mutate(iris, Max.Len= max(Sepal.Length,Petal.Length))
    )
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
1          5.1         3.5          1.4         0.2  setosa     7.9
2          4.9         3.0          1.4         0.2  setosa     7.9
3          4.7         3.2          1.3         0.2  setosa     7.9
4          4.6         3.1          1.5         0.2  setosa     7.9
5          5.0         3.6          1.4         0.2  setosa     7.9
6          5.4         3.9          1.7         0.4  setosa     7.9

どのように解決するのですか?

dplyr 0.2時点(だと思う)で rowwise() が実装されているので、この問題の答えはこうなります。

iris %>% 
  rowwise() %>% 
  mutate(Max.Len= max(Sepal.Length,Petal.Length))

非対応 rowwise 代替

5年後(!)、この回答はまだ多くのトラフィックを獲得しています。それが与えられたので rowwise はますます推奨されなくなりましたが、多くの人が直感的に使えると思っているようです。自分自身のために、Jenny Bryan の Rでtidyverseを使った行指向のワークフロー を読んで、このトピックについてよく理解してください。

私が見つけた最も簡単な方法は、Hadleyの例の1つである pmap :

iris %>% 
  mutate(Max.Len= purrr::pmap_dbl(list(Sepal.Length, Petal.Length), max))

この方法を用いると、関数に任意の数の引数を与えることができます ( .f ) の内部で pmap .

pmap は良い概念的アプローチです。なぜなら、行単位の操作を行っているとき、実際にはベクトル(データフレームの列)のリストからタプルを操作しているという事実を反映しているからです。