进阶篇 02

dplyr 包核心函数全解析

filter、select、mutate、summarize...让数据处理如丝般顺滑

📚
学习提示: 本教程内容仅供学习参考,实际应用时请结合具体数据和场景进行调整。 代码和方法可能需要根据实际情况进行修改。

dplyr 是 R 语言中最强大的数据操作包之一。 通过管道符 %>% 连接多个操作, 让代码清晰易读。掌握这 5 个核心函数,就能解决 80% 的数据处理需求!

1. filter() — 按条件筛选行

根据指定条件保留或过滤数据行

library(dplyr)

# 单条件筛选:加不加引号都可以
mtcars %>% filter(gear == "3") %>% head()
mtcars %>% filter(gear == 3) %>% head()

# 多条件筛选
mtcars %>% filter(carb >= 4) %>% head()

# 组合条件
mtcars %>% filter(gear == 4 & hp > 100)

💡 提示:支持逻辑运算符 &(且)、|(或)、!(非)

2. arrange() — 行排序

对数据行进行排序,默认升序

# 单列升序
mtcars %>% arrange(disp) %>% head()

# 多列排序:先按hp升序,再按mpg降序
mtcars %>% arrange(hp, desc(mpg)) %>% head()

# 使用 desc() 降序排列
mtcars %>% arrange(desc(wt)) %>% head()

📌 注意:NA 值默认排在最后,可以使用 na.last = TRUE/FALSE 控制

3. select() — 选择列

选择指定的列,支持模糊匹配

# 手动选择列
mtcars %>% select(hp, mpg, disp) %>% head()

# 模糊匹配辅助函数
iris %>%
  select(contains("Sep")) %>%
  head()

# 调整列顺序 + everything()
iris %>%
  select(Petal.Width, Species, everything()) %>%
  head()

select 辅助函数:

starts_with("abc") 匹配开头
ends_with("xyz") 匹配结尾
contains("ijk") 包含字符
matches("regex") 正则表达式
num_range("x", 1:3) x1, x2, x3
everything() 所有剩余列

4. mutate() — 添加/修改列

添加新列或修改现有列

# 简单计算
iris %>%
  mutate(Sepal.Length_width = Sepal.Length + Sepal.Width) %>%
  head()

# 复杂公式
iris %>%
  mutate(
    Sepal.Length_norm = Sepal.Length / mean(Sepal.Length, na.rm = TRUE),
    Sepal_Ratio = Sepal.Length / Sepal.Width
  ) %>%
  head()

💡 技巧:mutate 中可以使用 across() 对多列进行批量操作

5. summarize() — 汇总统计

对数据进行汇总,常与 group_by 联用

# 基本汇总
mtcars %>%
  summarise(
    mean_disp = mean(disp),
    n = n(),
    sum_disp = sum(disp)
  )

# 分组汇总
mtcars %>%
  group_by(cyl) %>%
  summarise(
    mean_disp = mean(disp),
    n = n(),
    total = sum(disp)
  )

# 多分组汇总
mtcars %>%
  group_by(cyl, vs) %>%
  summarise(mean = mean(disp), n = n())

常用汇总函数:

mean() sum() n() n_distinct() min() max() median() sd()

🔥 进阶:分位数汇总

# 计算分组分位数
mtcars %>%
  group_by(cyl) %>%
  summarise(
    qs = quantile(disp, c(0.25, 0.75)),
    prob = c(0.25, 0.75)
  )

# 自定义分位数函数
my_quantile <- function(x, probs) {
  tibble(x = quantile(x, probs), probs = probs)
}

mtcars %>%
  group_by(cyl) %>%
  summarise(my_quantile(disp, c(0.25, 0.75)))

📝 dplyr 核心函数速查表

函数 功能 示例
filter() 筛选行 filter(x > 10)
arrange() 排序行 arrange(x, desc(y))
select() 选择列 select(a, b, everything())
mutate() 添加列 mutate(new = x * 2)
summarise() 汇总 summarise(mean = mean(x))