数据处理三剑客:dplyr、tidyr、purrr速查指南

数据处理三剑客:dplyr、tidyr、purrr速查指南

【免费下载链接】cheatsheets Posit Cheat Sheets - Can also be found at https://posit.co/resources/cheatsheets/. 【免费下载链接】cheatsheets 项目地址: https://gitcode.com/gh_mirrors/chea/cheatsheets

本文全面介绍了R语言tidyverse生态系统中三个核心数据处理包:dplyr、tidyr和purrr的协同工作流和最佳实践。dplyr专注于数据转换,提供数据汇总、分组、观测值和变量操作等核心功能;tidyr负责数据整理,包括宽长格式转换、单元格拆分合并、缺失值处理和数据嵌套;purrr实现函数式编程的映射操作,支持单参数、多参数和带索引的映射。文章通过实际案例展示了三包协同的高效数据处理生命周期,从数据整理到转换再到迭代分析,并提供了性能优化、错误处理和可视化工作流等高级技巧。

数据转换(data-transformation)核心函数

在R语言的数据处理生态系统中,dplyr包无疑是数据转换的核心工具。它提供了一套简洁、一致的函数语法,使得数据转换操作变得直观且高效。dplyr的设计哲学基于"整洁数据"(tidy data)理念,强调每个变量独占一列、每个观测独占一行,这种结构为数据转换提供了坚实的基础。

核心数据转换函数分类

dplyr的数据转换函数可以系统性地分为几个主要类别,每个类别都针对特定的数据操作需求:

1. 数据汇总函数 (Summarize Cases)

汇总函数用于对数据进行聚合计算,将多个观测值压缩为单个汇总统计量:

# 基本汇总统计
mtcars |> summarize(avg_mpg = mean(mpg), max_hp = max(hp))

# 分组计数
mtcars |> count(cyl, sort = TRUE)

# 多变量汇总
mtcars |> 
  group_by(cyl) |> 
  summarize(
    avg_mpg = mean(mpg),
    sd_mpg = sd(mpg),
    n = n()
  )
2. 数据分组操作 (Group Cases)

分组操作是dplyr最强大的功能之一,允许对数据子集进行并行处理:

# 传统分组语法
mtcars |> 
  group_by(cyl, gear) |> 
  summarize(avg_mpg = mean(mpg))

# 新型.by参数语法(dplyr 1.1.0+)
mtcars |> 
  summarize(avg_mpg = mean(mpg), .by = c(cyl, gear))

# 行级分组处理
starwars |>
  rowwise() |>
  mutate(film_count = length(films))
3. 观测值操作 (Manipulate Cases)

这类函数用于筛选、排序和操作数据行:

提取观测值
# 条件筛选
mtcars |> filter(mpg > 20 & cyl == 4)

# 去重处理
mtcars |> distinct(gear, carb)

# 位置切片
mtcars |> slice(1:5)          # 前5行
mtcars |> slice_sample(n = 3) # 随机3行
mtcars |> slice_min(mpg, n = 3) # mpg最小的3行
排序观测值
# 升序排列
mtcars |> arrange(mpg)

# 降序排列  
mtcars |> arrange(desc(mpg))

# 多列排序
mtcars |> arrange(cyl, desc(mpg))
4. 变量操作 (Manipulate Variables)

这类函数专注于列的提取、重命名和操作:

提取变量
# 选择特定列
mtcars |> select(mpg, hp, wt)

# 使用选择辅助函数
mtcars |> select(starts_with("m"))    # 以m开头的列
mtcars |> select(ends_with("p"))      # 以p结尾的列  
mtcars |> select(contains("a"))       # 包含a的列
mtcars |> select(mpg:disp)            # mpg到disp之间的列
创建新变量
# 基本变量创建
mtcars |> mutate(
  gpm = 1 / mpg,           # 每加仑英里数的倒数
  hp_per_cyl = hp / cyl,   # 每气缸马力
  performance = hp / wt    # 性能指标
)

# 条件变量创建
mtcars |> mutate(
  efficiency = case_when(
    mpg > 25 ~ "高效",
    mpg > 20 ~ "中等",
    TRUE ~ "低效"
  )
)
5. 多变量同时操作

dplyr提供了强大的跨列操作能力,特别是across()函数:

# 对多列应用相同函数
mtcars |> 
  summarize(across(c(mpg, hp, wt), mean))

# 使用选择辅助函数
mtcars |> 
  summarize(across(where(is.numeric), mean))

# 应用多个函数
mtcars |> 
  summarize(across(
    c(mpg, hp, wt),
    list(mean = mean, sd = sd, min = min)
  ))

# 条件性列操作
mtcars |> 
  mutate(across(
    where(is.numeric),
    ~ .x / max(.x, na.rm = TRUE)  # 数值列标准化
  ))

向量化函数在数据转换中的应用

dplyr的mutate()函数与向量化函数配合使用,可以高效地创建新变量:

mermaid

常用向量化函数示例
# 偏移函数
mtcars |> mutate(
  mpg_lag = lag(mpg),     # 前一行的mpg值
  mpg_lead = lead(mpg)    # 后一行的mpg值
)

# 累积聚合函数
mtcars |> mutate(
  cum_mpg = cumsum(mpg),   # 累积mpg总和
  cum_avg_mpg = cummean(mpg) # 累积mpg平均值
)

# 排名函数
mtcars |> mutate(
  mpg_rank = min_rank(mpg),      # 最小排名
  mpg_dense_rank = dense_rank(mpg) # 密集排名
)

管道操作符的工作流程

dplyr与管道操作符|>的配合使用,形成了清晰的数据处理流水线:

mermaid

实际应用案例

让我们通过一个完整的案例来展示dplyr核心函数的综合应用:

# 综合数据转换案例
analysis_result <- mtcars |>
  # 数据筛选:只分析4缸和6缸发动机
  filter(cyl %in% c(4, 6)) |>
  
  # 变量选择:选择相关列
  select(mpg, hp, wt, cyl, gear) |>
  
  # 创建新变量:性能指标
  mutate(
    hp_per_ton = hp / (wt * 0.453592),  # 每吨马力
    efficiency_category = case_when(
      mpg > 25 ~ "优秀",
      mpg > 20 ~ "良好", 
      TRUE ~ "一般"
    )
  ) |>
  
  # 数据分组:按气缸数和效率类别
  group_by(cyl, efficiency_category) |>
  
  # 分组汇总统计
  summarize(
    avg_hp = mean(hp),
    avg_mpg = mean(mpg),
    avg_hp_per_ton = mean(hp_per_ton),
    count = n(),
    .groups = "drop"
  ) |>
  
  # 最终排序:按气缸数和平均mpg降序
  arrange(cyl, desc(avg_mpg))

print(analysis_result)

性能优化技巧

  1. 避免不必要的复制:使用.keep参数控制mutate的输出列
  2. 合理使用分组:及时使用ungroup()释放分组状态
  3. 向量化操作:优先使用内置向量化函数而非自定义函数
  4. 选择适当的函数变体:根据输出类型选择map_*系列函数
# 性能优化示例
optimized_result <- mtcars |>
  mutate(
    gpm = 1 / mpg,
    hp_per_cyl = hp / cyl,
    .keep = "used"  # 只保留使用的列
  ) |>
  group_by(cyl) |>
  summarize(
    across(where(is.numeric), mean),
    n = n()
  ) |>
  ungroup()  # 及时解除分组

dplyr的数据转换核心函数通过这种模块化、管道化的设计,使得复杂的数据处理任务可以被分解为一系列简单的步骤,大大提高了数据处理的效率和代码的可读性。

数据整理(tidyr)的数据重塑技巧

在数据分析工作中,我们经常遇到数据格式不符合分析需求的情况。tidyr包提供了一系列强大的数据重塑函数,能够帮助我们将数据从宽格式转换为长格式,或者反之,以及处理各种复杂的数据结构问题。掌握这些数据重塑技巧是每个数据科学家必备的核心技能。

数据透视:宽格式与长格式转换

数据透视是tidyr中最常用的数据重塑操作,主要包括pivot_longer()pivot_wider()两个函数。

pivot_longer:从宽格式到长格式

pivot_longer()函数用于将数据从宽格式转换为长格式,这种转换在统计分析中特别有用,因为它符合tidy data的原则。

# 示例:宽格式数据
wide_data <- tibble(
  country = c("China", "USA", "Japan"),
  `2020` = c(14.7, 20.9, 5.0),
  `2021` = c(15.4, 22.0, 5.1),
  `2022` = c(16.1, 23.3, 5.2)
)

# 转换为长格式
long_data <- wide_data %>%
  pivot_longer(
    cols = `2020`:`2022`,      # 选择要转换的列
    names_to = "year",         # 新列名:存储原列名
    values_to = "gdp"          # 新列名:存储原值
  )

转换后的数据结构更加整洁,每个观测值占据一行,便于后续的统计分析。

pivot_wider:从长格式到宽格式

pivot_wider()pivot_longer()的逆操作,用于将长格式数据转换为宽格式。

# 示例:长格式数据
long_data <- tibble(
  country = rep(c("China", "USA", "Japan"), each = 3),
  year = rep(2020:2022, 3),
  gdp = c(14.7, 15.4, 16.1, 20.9, 22.0, 23.3, 5.0, 5.1, 5.2)
)

# 转换为宽格式
wide_data <- long_data %>%
  pivot_wider(
    names_from = year,        # 新列名来源
    values_from = gdp         # 值来源
  )

单元格拆分与合并

在处理实际数据时,经常需要拆分或合并单元格内容,tidyr提供了专门的函数来处理这些情况。

separate_wider_delim:按分隔符拆分列

当一列中包含多个信息时,可以使用separate_wider_delim()函数按指定分隔符进行拆分。

# 示例:包含复合信息的数据
compound_data <- tibble(
  id = 1:3,
  rate = c("100/1000", "150/1500", "200/2000")
)

# 按"/"分隔符拆分
split_data <- compound_data %>%
  separate_wider_delim(
    rate, 
    delim = "/",
    names = c("cases", "population")
  )
unite:合并多列为单列

与拆分相反,unite()函数可以将多列合并为一列。

# 示例:需要合并的日期数据
date_parts <- tibble(
  year = c(2020, 2021, 2022),
  month = c(1, 2, 3),
  day = c(10, 15, 20)
)

# 合并为完整日期
full_dates <- date_parts %>%
  unite("date", year, month, day, sep = "-")

处理缺失值和数据扩展

缺失值处理

tidyr提供了多种处理缺失值的方法:

# 创建包含缺失值的数据
data_with_na <- tibble(
  group = c("A", "A", "B", "B", "C"),
  value = c(1, NA, 3, NA, 5)
)

# 删除包含NA的行
clean_data <- data_with_na %>% drop_na()

# 填充NA值(向下填充)
filled_data <- data_with_na %>% fill(value)

# 替换NA值为特定值
replaced_data <- data_with_na %>% 
  replace_na(list(value = 0))
数据扩展:expand和complete

expand()complete()函数用于创建数据的所有可能组合,特别适用于处理隐式缺失值。

# 示例数据
sample_data <- tibble(
  group = c("A", "B"),
  time = c(1, 2),
  value = c(10, 20)
)

# 创建所有可能的组合
all_combinations <- sample_data %>% expand(group, time)

# 填充缺失的组合并保留原值
completed_data <- sample_data %>% complete(group, time)

嵌套数据结构

嵌套数据框架是一种高级的数据组织结构,允许在数据框中存储列表列。

# 创建嵌套数据
nested_data <- storms %>%
  group_by(name) %>%
  nest()

# 访问嵌套数据
first_storm_data <- nested_data$data[[1]]

# 使用purrr处理嵌套数据
nested_analysis <- nested_data %>%
  mutate(
    max_wind = map_dbl(data, ~max(.x$wind)),
    avg_pressure = map_dbl(data, ~mean(.x$pressure, na.rm = TRUE))
  )

数据重塑的最佳实践

为了确保数据重塑操作的高效和准确,建议遵循以下最佳实践:

  1. 数据验证:在重塑前检查数据的完整性和一致性
  2. 逐步操作:复杂的重塑操作应该分解为多个简单步骤
  3. 结果验证:每次重塑后都应该验证数据的结构和内容
  4. 文档记录:记录每个重塑操作的目的和效果

mermaid

通过掌握这些数据重塑技巧,你能够更加灵活地处理各种复杂的数据结构问题,为后续的数据分析和可视化奠定坚实的基础。记住,良好的数据整理是成功数据分析的一半。

函数式编程(purrr)的映射操作

purrr包是R语言中函数式编程的核心工具集,它提供了一套完整且一致的映射函数,让数据处理变得更加优雅和高效。映射操作的核心思想是将函数应用到数据结构(如列表、向量)的每个元素上,避免了传统的for循环,使代码更加简洁和可读。

基础映射函数

purrr提供了多种映射函数来满足不同的应用场景:

1. map() - 基础映射

map()函数是最基础的映射函数,它将一个函数应用到列表或向量的每个元素上,并返回一个列表。

library(purrr)

# 创建示例数据
x <- list(a = 1:10, b = 11:20, c = 21:30)

# 计算每个元素的平均值
map(x, mean)
# 输出: list(a = 5.5, b = 15.5, c = 25.5)

# 使用匿名函数
map(x, ~ .x * 2)  # 每个元素乘以2
2. 类型特定的映射函数

purrr提供了一系列类型特定的映射函数,它们返回特定类型的向量而不是列表:

函数返回类型示例
map_lgl()逻辑向量map_lgl(x, is.numeric)
map_int()整型向量map_int(x, length)
map_dbl()双精度向量map_dbl(x, mean)
map_chr()字符向量map_chr(x, paste, collapse = "")
map_vec()最简类型向量map_vec(x, sum)
# 返回数值向量而不是列表
map_dbl(x, mean)  # 返回: c(5.5, 15.5, 25.5)
map_int(x, length)  # 返回: c(10, 10, 10)

多参数映射

3. map2() - 双参数映射

map2()函数允许同时对两个列表或向量的对应元素应用函数:

y <- list(1, 2, 3)
z <- list(4, 5, 6)

# 对应元素相乘
map2(y, z, \(x, y) x * y)
# 输出: list(4, 10, 18)

# 使用公式语法
map2(y, z, ~ .x + .y)  # 对应元素相加
4. pmap() - 多参数映射

pmap()函数可以处理任意数量的参数,适用于复杂的多参数函数应用:

# 创建参数列表
params <- list(
  list(x = 1:3, times = 2),
  list(x = 4:6, times = 3),
  list(x = 7:9, times = 4)
)

# 对每个参数集应用rep函数
pmap(params, rep)
# 输出: list(c(1,1,2,2,3,3), c(4,4,4,5,5,5,6,6,6), c(7,7,7,7,8,8,8,8,9,9,9,9))

索引映射

5. imap() - 带索引的映射

imap()函数在映射时同时提供元素值和索引(或名称):

named_list <- list(alpha = "a", beta = "b", gamma = "c")

# 使用索引和值
imap(named_list, \(value, name) paste0(name, ": ", value))
# 输出: list("alpha: a", "beta: b", "gamma: c")

# 对于未命名列表,使用数字索引
unnamed_list <- list("a", "b", "c")
imap(unnamed_list, \(value, index) paste0(index, ": ", value))

函数快捷方式

purrr提供了简洁的函数定义语法:

# 传统函数定义
map(x, function(element) element * 2)

# purrr简洁语法
map(x, ~ .x * 2)  # 使用公式语法
map(x, \(x) x * 2)  # 使用R 4.1+的匿名函数语法

# 多参数简洁语法
map2(x, y, \(x, y) x + y)
pmap(list(x, y, z), \(x, y, z) x * y * z)

条件映射

6. 条件性映射函数

purrr提供了根据条件选择性地应用函数的映射变体:

# modify_if - 仅对满足条件的元素应用函数
mixed_list <- list(1, "text", 3, "another", 5)
modify_if(mixed_list, is.numeric, ~ .x * 2)
# 输出: list(2, "text", 6, "another", 10)

# modify_at - 对特定位置的元素应用函数
modify_at(x, "b", ~ .x + 100)  # 仅修改名为"b"的元素

映射操作流程图

mermaid

实际应用示例

数据处理管道中的映射
library(dplyr)
library(purrr)

# 创建包含列表列的数据框
df <- tibble(
  group = c("A", "B", "C"),
  values = list(1:3, 4:6, 7:9)
)

# 使用map在mutate中处理列表列
df %>%
  mutate(
    mean_val = map_dbl(values, mean),      # 计算每组平均值
    squared = map(values, ~ .x ^ 2),       # 对每个值平方
    summary = map_chr(values, ~ paste("Mean:", mean(.x)))  # 创建摘要字符串
  )
文件处理批量操作
# 批量读取和处理文件
file_paths <- c("data1.csv", "data2.csv", "data3.csv")

# 使用map批量读取文件
data_list <- map(file_paths, read.csv)

# 对每个数据集进行相同的处理
processed_data <- map(data_list, ~ {
  .x %>%
    filter(!is.na(important_column)) %>%
    mutate(new_column = old_column * 2)
})

# 使用walk进行副作用操作(如保存文件)
walk(processed_data, ~ write.csv(.x, "processed_data.csv"))

性能优化技巧

  1. 使用类型特定函数:当你知道输出类型时,使用map_*系列函数比map()更高效
  2. 避免不必要的列表创建:如果最终需要向量,直接使用map_*函数
  3. 并行处理:对于计算密集型任务,考虑使用furrr包进行并行映射
# 性能对比示例
large_list <- as.list(1:10000)

# 较慢:map() + as.numeric()
system.time(result1 <- as.numeric(map(large_list, ~ .x * 2)))

# 较快:直接使用map_dbl()
system.time(result2 <- map_dbl(large_list, ~ .x * 2))

映射操作是函数式编程的核心,通过purrr包的这些工具,你可以写出更加简洁、可读和高效的R代码,特别是在处理复杂数据结构和批量操作时表现出色。

三包协同工作流的最佳实践

在R语言的tidyverse生态系统中,dplyr、tidyr和purrr这三个包构成了数据处理的核心三剑客。它们各自拥有独特的功能定位,但当它们协同工作时,能够构建出强大而优雅的数据处理流水线。本节将深入探讨这三个包协同工作的最佳实践模式。

数据处理的完整生命周期

一个典型的数据处理工作流通常遵循以下生命周期:

mermaid

核心协同模式

模式一:数据整理 → 数据转换 → 迭代分析

这是最常见的协同工作流模式,充分利用每个包的核心优势:

# 示例:分析多个数据集的特征统计
library(dplyr)
library(tidyr)
library(purrr)

# 1. tidyr: 创建嵌套数据结构
nested_data <- mtcars %>%
  group_by(cyl) %>%
  nest()

# 2. purrr: 对每个分组应用复杂分析函数
analysis_results <- nested_data %>%
  mutate(
    model = map(data, ~ lm(mpg ~ wt + hp, data = .x)),
    summary_stats = map(data, ~ {
      tibble(
        mean_mpg = mean(.x$mpg),
        sd_mpg = sd(.x$mpg),
        n = nrow(.x)
      )
    }),
    predictions = map2(data, model, ~ predict(.y, newdata = .x))
  )

# 3. dplyr: 整理和展示最终结果
final_results <- analysis_results %>%
  unnest(summary_stats) %>%
  select(cyl, mean_mpg, sd_mpg, n) %>%
  arrange(desc(mean_mpg))
模式二:迭代创建 → 数据整理 → 批量处理

当需要处理多个相似的数据集时,这种模式特别有效:

# 创建多个相关数据集
data_sets <- list(
  set1 = mtcars %>% filter(cyl == 4),
  set2 = mtcars %>% filter(cyl == 6), 
  set3 = mtcars %>% filter(cyl == 8)
)

# purrr: 批量处理每个数据集
processed_data <- data_sets %>%
  map(~ {
    .x %>%
      # dplyr: 数据转换
      mutate(performance_ratio = mpg / wt) %>%
      # tidyr: 如果需要可以进一步整理
      pivot_longer(cols = c(mpg, hp), names_to = "metric", values_to = "value")
  }) %>%
  # 合并所有结果
  list_rbind(names_to = "cylinder_group")

高级协同技巧

技巧一:使用map函数处理分组数据
# 创建复杂的分组分析流水线
advanced_analysis <- mtcars %>%
  # tidyr: 创建嵌套结构
  nest(data = -c(cyl, gear)) %>%
  # purrr: 对每个分组应用多个分析函数
  mutate(
    # 线性模型
    models = map(data, ~ lm(mpg ~ wt + hp, data = .x)),
    # 描述性统计
    stats = map(data, ~ {
      summarise(.x,
        across(c(mpg, wt, hp), list(mean = mean, sd = sd))
      )
    }),
    # 预测区间
    predictions = map2(data, models, ~ {
      predict(.y, newdata = .x, interval = "confidence") %>%
        as_tibble()
    })
  ) %>%
  # tidyr: 展开统计结果
  unnest(stats) %>%
  # dplyr: 选择和重命名
  select(cyl, gear, starts_with("mpg_"), starts_with("wt_"), starts_with("hp_"))
技巧二:条件性数据处理流水线
# 根据数据特征动态选择处理策略
adaptive_processing <- function(data) {
  # 检查数据特征
  data_types <- map_chr(data, class)
  numeric_cols <- names(data_types[data_types %in% c("numeric", "integer")])
  
  if (length(numeric_cols) > 0) {
    # 对数值列进行标准化处理
    processed_data <- data %>%
      mutate(across(all_of(numeric_cols), ~ (.x - mean(.x)) / sd(.x)))
  } else {
    # 如果没有数值列,进行其他处理
    processed_data <- data %>%
      mutate(across(where(is.character), as.factor))
  }
  
  return(processed_data)
}

# 应用条件处理
result <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(processed_data = map(data, adaptive_processing)) %>%
  unnest(processed_data)

性能优化最佳实践

表格:三包协同性能优化策略
场景优化策略代码示例
大数据集处理使用group_split()代替group_by() %>% nest()mtcars %>% group_split(cyl) %>% map(analysis_function)
内存优化尽早过滤不需要的数据filter() %>% select() %>% 然后进行复杂操作
并行处理结合furrr包进行并行map操作future_map()代替map()
惰性求值使用lazy_dt()创建数据表后端lazy_dt(mtcars) %>% 操作 %>% collect()
示例:优化后的协同工作流
library(dtplyr)
library(furrr)

# 启用并行处理
plan(multisession, workers = 4)

# 优化的工作流
optimized_workflow <- mtcars %>%
  # 尽早过滤和选择
  filter(cyl %in% c(4, 6, 8)) %>%
  select(mpg, wt, hp, cyl) %>%
  # 转换为数据表后端
  lazy_dt() %>%
  # 分组处理
  group_by(cyl) %>%
  # 并行map操作
  nest() %>%
  mutate(
    results = future_map(data, ~ {
      # 复杂的分析操作
      model <- lm(mpg ~ wt + hp, data = .x)
      tibble(
        r_squared = summary(model)$r.squared,
        coefficients = list(coef(model))
      )
    })
  ) %>%
  # 收集结果
  collect() %>%
  unnest(results)

错误处理和调试

在复杂的协同工作流中,健壮的错误处理至关重要:

# 安全的map操作 with 错误处理
safe_analysis <- function(data) {
  safely_result <- safely(~ {
    # 尝试进行分析
    model <- lm(mpg ~ wt + hp, data = .x)
    list(
      success = TRUE,
      result = summary(model)$r.squared
    )
  })
  
  result <- safely_result(data)
  
  if (!is.null(result$error)) {
    return(list(success = FALSE, error = result$error$message))
  } else {
    return(result$result)
  }
}

# 应用安全函数
robust_results <- mtcars %>%
  group_by(cyl) %>%
  nest() %>%
  mutate(
    analysis_result = map(data, safe_analysis),
    status = map_chr(analysis_result, ~ ifelse(.x$success, "成功", "失败")),
    result_value = map_dbl(analysis_result, ~ ifelse(.x$success, .x$result, NA_real_))
  )

可视化协同工作流

为了更好理解三个包的协同关系,以下是一个典型的数据分析场景:

mermaid

这种协同工作流的优势在于每个包都专注于自己最擅长的领域,同时通过管道操作无缝连接,形成了高效且易于理解的数据处理流水线。

通过掌握这些最佳实践,您将能够构建出既高效又健壮的数据处理流程,充分发挥tidyverse生态系统的强大功能。记住,关键在于理解每个包的核心优势,并在适当的场景中选择最合适的工具组合。

总结

数据处理三剑客dplyr、tidyr和purrr构成了R语言tidyverse生态系统的核心支柱,每个包都有其独特的定位和优势。dplyr提供直观高效的数据转换语法,tidyr专注于数据结构和格式的整理,purrr则实现了优雅的函数式编程映射操作。当这三个包协同工作时,能够构建出强大而高效的数据处理流水线,涵盖从数据整理、转换到复杂迭代分析的全生命周期。掌握它们各自的核心理念和协同工作模式,能够显著提升数据处理的效率和代码的可读性,是每个R语言数据科学家必备的核心技能。通过本文介绍的最佳实践和优化技巧,读者可以构建出既健壮又高效的数据处理流程,充分发挥tidyverse生态系统的强大功能。

【免费下载链接】cheatsheets Posit Cheat Sheets - Can also be found at https://posit.co/resources/cheatsheets/. 【免费下载链接】cheatsheets 项目地址: https://gitcode.com/gh_mirrors/chea/cheatsheets

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值