Rのdplyrで複数のカラムをmutateする

Version 1.0.0以降のdplyrで複数のカラムを mutate するには、mutate_atは非推奨で、代わりにmutateacrossを使います。

例えば、irisSepal.Lengthの値をもとにした各カラムの相対値を求める場合は、以下のように書きます。

> iris %>% mutate(across(contains("."), ~ . / Sepal.Length)) %>% head()
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1            1   0.6862745    0.2745098  0.03921569  setosa
2            1   0.6122449    0.2857143  0.04081633  setosa
3            1   0.6808511    0.2765957  0.04255319  setosa
4            1   0.6739130    0.3260870  0.04347826  setosa
5            1   0.7200000    0.2800000  0.04000000  setosa
6            1   0.7222222    0.3148148  0.07407407  setosa

1.0.0以前であれば、mutate_atを使っていたと思いますが、これにはバグがあり、上記のような計算をしようと思うと、以下のように、処理 (.funs) の中に、操作するカラム自身が含まれているときに、期待どおりの動きません。1.0.0以降ではmutat_atをはじめとした、mutateの関連メソッドは非推奨になっており、このバグは今後修正の予定はないようなので、注意が必要です。

> iris %>% mutate_at(vars(contains(".")), ~ . / Sepal.Length) %>% head()
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1            1         3.5          1.4         0.2  setosa
2            1         3.0          1.4         0.2  setosa
3            1         3.2          1.3         0.2  setosa
4            1         3.1          1.5         0.2  setosa
5            1         3.6          1.4         0.2  setosa
6            1         3.9          1.7         0.4  setosa