Version 1.0.0以降のdplyrで複数のカラムを mutate
するには、mutate_at
は非推奨で、代わりにmutate
とacross
を使います。
例えば、iris
でSepal.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