跳转到主要内容
模块 4 · 第 2 课(共 2)课程中的8/10~15 min
模块课程(2/2)

突变和聚合

除了选择和过滤之外,dplyr 还提供强大的功能来创建新的计算列并通过将数据聚合到组来汇总数据。


创建新列:mutate()

mutate() 动词允许您计算新列或修改现有列,同时保持所有原始列不变。

R
# Adds a 'double_salary' column computed as 'salary' multiplied by 2
df %>%
  mutate(double_salary = salary * 2)

# You can create multiple columns at once
df %>%
  mutate(
    total_cost = quantity * price,
    tax = total_cost * 0.22
  )

分组和聚合:group_by() 和 summarise()

通常,数据分析需要计算特定行组的汇总统计数据(例如平均值、总和、计数)(例如,计算每个部门的平均工资)。

1.group_by()

按一列或多列的值对数据框进行分组。它本身不会改变数据的视觉外观,但它向 dplyr 发出信号,表明后续操作应“逐组”执行。

2.summarise()(或summarize())

通过应用 mean()、sum()、min()、max() 或 n()(对行进行计数)等统计函数,将多行折叠为单个汇总行。

R
# Calculates the average salary per department
df %>%
  group_by(department) %>%
  summarise(mean_salary = mean(salary))

如果你想统计每个组有多少条记录:

R
# Counts how many employees are in each city
df %>%
  group_by(city) %>%
  summarise(count = n())

自己尝试一下

练习 1:创建计算列

锻炼#r.m4.l2.e1
尝试:0加载中...

给定数据框 df,通过使用 mutate() 将数量列乘以价格列来创建一个名为 Total_price 的新列。将结果保存在 df_new 中。

正在加载编辑器...
显示提示

在 df 上的管道内使用 mutate(total_price =Quantity * Price)。

3 次尝试后可用的解决方案

练习 2:用平均值分组并总结

锻炼#r.m4.l2.e2
尝试:0加载中...

计算工资列的平均值,按部门列对记录进行分组。将聚合列保存为名称mean_salary,并将最终结果分配给df_grouped。

正在加载编辑器...
显示提示

美国 df %>% group_by(部门) %>% summarise(mean_salary = Mean(salary))

3 次尝试后可用的解决方案

练习 3:计算每组的元素数量

锻炼#r.m4.l2.e3
尝试:0加载中...

计算每个城市的行数(城市列)。使用 n() 函数将计数分配给 summarise() 内的 count 变量,并将最终结果保存在 df_counts 中。

正在加载编辑器...
显示提示

在 una 管道中组合 group_by(city) con summarise(count = n()) 。

3 次尝试后可用的解决方案

练习 4:多重总结

锻炼#r.m4.l2.e4
尝试:0加载中...

计算按类别列分组的价格列的最小值 (min_price) 和最大值 (max_price)。将结果保存在 df_summary 中。

正在加载编辑器...
显示提示

在 summarise() 内,用逗号分隔 min_price = min(price) 和 max_price = max(price) 指标。

3 次尝试后可用的解决方案

练习 5:分组和组合过滤器

锻炼#r.m4.l2.e5
尝试:0加载中...

编写一个管道,按部门列对 df 进行分组,使用 mutate() 计算工资的平均值,将其保存在新列 avg_salary 中(注意:使用 mutate,而不是汇总,以保留所有行),最后过滤以仅保留工资严格大于 avg_salary 的记录。保存在资源中。

正在加载编辑器...
显示提示

美国 df %>% group_by(部门) %>% mutate(avg_salary = Mean(salary)) %>% filter(salary > avg_salary)

3 次尝试后可用的解决方案