下面涉及 mutate 的两个版本的代码是否相同?
为了提供一些背景信息,练习是创建一个名为“客人”的列,该列组合了“成人、婴儿和儿童”的其他列。
example_df <- bookings_df %>%
mutate(guests = adults + children + babies)
**代码版本2: **
example_df <- bookings_df %>%
mutate(guests = adults, children, babies)
两者都正确吗?我本以为在这两种情况下,“访客”列将取代成人、儿童和婴儿列,但当我查看数据框时我可以看到所有列?
我尝试运行两个版本的代码,但没有看到任何差异
dplyr::mutate()
既可以创建新变量也可以覆盖现有变量。使用所提供示例数据库的简化版本mtcars
,如果您要求 R 解释代码:
mtcars2 <- mtcars[1:5, c("mpg", "cyl", "disp")]
mtcars2 %>%
mutate(mpg, cyl)
您没有要求它对列 mpg
和
cyl
做任何事情,因此它返回完全相同的数据帧(本质上什么都不做):
# mpg cyl disp
# Mazda RX4 21.0 6 160
# Mazda RX4 Wag 21.0 6 160
# Datsun 710 22.8 4 108
# Hornet 4 Drive 21.4 6 258
# Hornet Sportabout 18.7 8 360
如果你要求 R 解释以下命令:
mtcars2 %>%
mutate(mpg = mpg ^ 2, cyl)
您要求 R (1) 用
mpg
的平方值覆盖 mpg
列,并且 (2) 对 cyl
不执行任何操作 - 因此它分别返回这些列的平方值和相同值.
# mpg cyl disp
# Mazda RX4 441.00 6 160
# Mazda RX4 Wag 441.00 6 160
# Datsun 710 519.84 4 108
# Hornet 4 Drive 457.96 6 258
# Hornet Sportabout 349.69 8 360
在您的第一个代码中,您将通过对三个变量求和来创建一个新列,
guests
。类似地:
mtcars2 %>%
mutate(guests = mpg + cyl + disp)
这将创建一个新列,
guests
(不会覆盖)并返回三列的总和:
# mpg cyl disp guests
# Mazda RX4 21.0 6 160 187.0
# Mazda RX4 Wag 21.0 6 160 187.0
# Datsun 710 22.8 4 108 134.8
# Hornet 4 Drive 21.4 6 258 285.4
# Hornet Sportabout 18.7 8 360 386.7
您提供的第二个代码 (1) 要求 R 创建一个新列
guests
,它等于值 adults
,然后 (2) 对 children
和
babies
不执行任何操作。类似地:
mtcars2 %>%
mutate(guests = mpg, cyl, disp)
返回一个新列 guests
,它等于
mpg
,并且对
cyl
或
disp
不执行任何操作
# mpg cyl disp guests
# Mazda RX4 21.0 6 160 21.0
# Mazda RX4 Wag 21.0 6 160 21.0
# Datsun 710 22.8 4 108 22.8
# Hornet 4 Drive 21.4 6 258 21.4
# Hornet Sportabout 18.7 8 360 18.7
因此,如果您的目标是将三个变量结合起来,第一个是正确的,而第二个是不正确的。
guests
是
adults + children + babies
的总和,在第二个示例中,
guests
只是
adults
。我认为你正在寻找论点
.keep = "none"
。在不同的 mutate 示例中使用它,它可能会帮助您理解它。另外,请查看
?mutate
了解有关该函数和
.keep
参数的更多信息。