在使用dplyr的mutate函数时,有时会出现多列变量需要添加的情况。例如,我们想要给数据集添加两列分别表示原始变量的平方和立方。一般的做法是这样的:
library(dplyr)
df <- data.frame(x = 1:5, y = 2:6)
df %>% mutate(x2 = x^2, x3 = x^3)
这段代码运行后会得到一个包含新变量的数据集:
x y x2 x3
1 1 2 1 1
2 2 3 4 8
3 3 4 9 27
4 4 5 16 64
5 5 6 25 125
但是如果我们想要使用循环来实现同样的效果,可能会这样写:
df %>% mutate_at(vars(x), list(~ c("^2" = .^2, "^3" = .^3)))
代码的逻辑是先使用mutate_at函数,然后指定对x这一列进行操作。在list里面可以使用~符号定义一个匿名函数,这个函数里面定义了两个变量分别表示该列的平方和立方。在操作时,会对这两个变量分别赋值,但是这两个变量的值并不是我们期望的结果,而是每次循环中突变列的值。
修复这个问题的方法是使用mutate_if函数,并在list中定义两个列名,这样两个新变量就会被正确地添加。
df %>% mutate_if(vars(x), list(x2 = ~ .^2, x3 = ~ .^3))
代码的逻辑和之前相同,但是使用了不同的函数和变量格式。运行后,