当前位置: 首页 > news >正文

`tidyverse` 长表、宽表的处理

1. 整洁数据(Tidy Data)的核心概念

整洁数据的基本原则是:

  • 每个变量是一列。
  • 每个观测是一行。
  • 每个值是一个单元格。

这种数据格式非常适合数据分析和可视化,因为大多数数据分析工具(如 dplyrggplot2)都是基于这种格式设计的。

2. pivot_longer():将宽数据转换为长数据

pivot_longer() 函数用于将宽数据(wide data)转换为长数据(long data)。宽数据的特点是变量分布在多列中,而长数据的特点是变量集中在少数几列中。

基本语法
pivot_longer(data,cols,names_to,values_to,values_drop_na = FALSE,names_sep = NULL,names_pattern = NULL
)
  • data:要转换的数据框。
  • cols:需要转换的列。
  • names_to:列名对应的变量名。
  • values_to:单元格值对应的变量名。
  • values_drop_na:是否删除缺失值。
  • names_sepnames_pattern:用于处理复杂列名,将列名拆分为多个变量。
示例

假设我们有一个宽数据集 billboard,其中列名包含变量信息:

billboard <- data.frame(artist = c("Adele", "Beyonce"),song = c("Hello", "Formation"),week1 = c(100, 200),week2 = c(150, 250),week3 = c(120, 220)
)

使用 pivot_longer() 将其转换为长数据:

library(tidyr)billboard_long <- billboard %>%pivot_longer(cols = week1:week3,          # 指定需要转换的列names_to = "week",           # 列名对应的变量名values_to = "sales"          # 单元格值对应的变量名)print(billboard_long)

输出结果:

# A tibble: 6 × 4artist song  week  sales<chr>  <chr> <chr> <dbl>
1 Adele  Hello week1   100
2 Adele  Hello week2   150
3 Adele  Hello week3   120
4 Beyonce Formation week1   200
5 Beyonce Formation week2   250
6 Beyonce Formation week3   220

3. pivot_wider():将长数据转换为宽数据

pivot_wider() 函数用于将长数据(long data)转换为宽数据(wide data)。长数据的特点是变量集中在少数几列中,而宽数据的特点是变量分布在多列中。

基本语法
pivot_wider(data,names_from,values_from,id_cols = NULL
)
  • data:要转换的数据框。
  • names_from:列名的来源列。
  • values_from:值的来源列。
  • id_cols:唯一标识行的列。
示例

假设我们有一个长数据集 cms_patient_experience,其中每个组织的测量结果分布在多行中:

cms_patient_experience <- data.frame(organization = c("Org1", "Org1", "Org2", "Org2"),measure = c("Quality", "Safety", "Quality", "Safety"),score = c(80, 90, 85, 95)
)

使用 pivot_wider() 将其转换为宽数据:

cms_patient_experience_wide <- cms_patient_experience %>%pivot_wider(names_from = measure,  # 列名的来源列values_from = score,  # 值的来源列id_cols = organization  # 唯一标识行的列)print(cms_patient_experience_wide)

输出结果:

# A tibble: 2 × 3organization Quality Safety<chr>         <dbl>  <dbl>
1 Org1             80     90
2 Org2             85     95

好的,我来详细解释一下第4部分的内容,特别是如何处理复杂列名,以及如何使用 pivot_longer() 函数中的 names_tonames_sepnames_pattern 参数。

第4部分:处理复杂列名

1. 问题背景

在实际数据中,列名可能包含多个变量的信息。例如,列名可能是“变量名_变量值1_变量值2”的形式。这种情况下,我们需要将这些列名拆分为多个变量,以便更好地进行数据分析。

2. 示例数据集

假设我们有一个数据集 who2,列名中包含诊断方法、性别和年龄范围等信息:

who2 <- data.frame(country = c("Country1", "Country2"),diag1_male_0_14 = c(10, 20),diag1_female_0_14 = c(15, 25),diag2_male_15_24 = c(30, 40),diag2_female_15_24 = c(35, 45)
)

在这个数据集中:

  • diag1_male_0_14 表示诊断方法为 diag1,性别为 male,年龄范围为 0_14 的数据。
  • diag1_female_0_14 表示诊断方法为 diag1,性别为 female,年龄范围为 0_14 的数据。
  • 以此类推。
3. 目标

我们需要将这些列名拆分为多个变量,以便将数据转换为长格式(long format)。具体来说,我们需要将列名中的信息提取出来,形成以下几列:

  • diag:诊断方法
  • gender:性别
  • age_range:年龄范围
  • value:对应的值
4. 使用 pivot_longer() 函数

pivot_longer() 函数可以将宽数据转换为长数据。我们可以通过 names_to 参数指定新的列名,通过 names_sepnames_pattern 参数来拆分列名。

参数说明
  • cols:指定需要转换的列。
  • names_to:指定列名对应的变量名。
    • 如果列名中包含多个变量信息,可以使用 names_to = c("变量1", "变量2", ...)
    • 如果列名中包含变量名和变量值,可以使用 .value 作为特殊占位符。
  • names_sep:用于拆分列名的分隔符。
  • names_pattern:用于拆分列名的正则表达式。
示例代码
library(tidyr)who2_long <- who2 %>%pivot_longer(cols = -country,  # 排除 country 列names_to = c(".value", "gender", "age_range"),  # 使用 .value 提取变量名和变量值names_pattern = "(\\w+)_(\\w+)_(\\d+)_?(\\d+)?")print(who2_long)
5. 参数解释
  • cols = -country:表示排除 country 列,只对其他列进行操作。
  • names_to = c(".value", "gender", "age_range")
    • .value 是一个特殊占位符,表示列名中变量名的部分(如 diag1diag2)。
    • genderage_range 是我们希望提取的其他变量信息。
  • names_pattern = "(\\w+)_(\\w+)_(\\d+)_?(\\d+)?"
    • 这是一个正则表达式,用于匹配列名的结构。
    • (\\w+) 匹配一个或多个字母或数字,对应 diag1diag2
    • (\\w+) 匹配性别部分,如 malefemale
    • (\\d+)_?(\\d+)? 匹配年龄范围,如 0_1415_24
6. 输出结果
# A tibble: 8 × 5country diag       gender age_range value<chr>   <chr>      <chr>  <chr>     <dbl>
1 Country1 diag1      male   0_14        10
2 Country1 diag1     female 0_14        15
3 Country1 diag2      male   15_24       30
4 Country1 diag2     female 15_24       35
5 Country2 diag1      male   0_14        20
6 Country2 diag1     female 0_14        25
7 Country2 diag2      male   15_24       40
8 Country2 diag2     female 15_24       45

总结

  • names_to:指定列名对应的变量名,可以使用 .value 提取变量名。
  • names_pattern:使用正则表达式匹配列名的结构,提取多个变量信息。
  • names_sep:如果列名是用固定分隔符分隔的,可以使用 names_sep 参数。

通过这些参数,你可以灵活地处理复杂的列名,将宽数据转换为长数据,从而更好地进行数据分析和可视化。

5. 总结

  • 整洁数据的重要性:整洁数据格式便于使用 tidyverse 工具进行分析。
  • 数据整理工具
    • pivot_longer():将宽数据转换为长数据。
    • pivot_wider():将长数据转换为宽数据。
  • 数据整理的灵活性:根据分析需求灵活调整数据的组织方式,不要害怕多次转换。

通过这些工具,你可以轻松地将数据从一种格式转换为另一种格式,从而更好地进行数据分析和可视化。

http://www.dtcms.com/a/289390.html

相关文章:

  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)
  • 看板流程标准化和灵活性如何平衡
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 深入分析linux内核源代码
  • PID控制原理分析及应用(稳态误差详细分析)(一)
  • 【高等数学】第四章 不定积分——第四节 有理函数的积分
  • 【LeetCode 热题 100】124. 二叉树中的最大路径和——DFS
  • [Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏
  • Servlet API 详解
  • 佛经个人阅读(二)《金刚经》解析
  • git fork的项目远端标准协作流程 仓库设置[设置成upstream]
  • 基于自定义数据集微调SigLIP2-分类任务
  • C语言:深入理解指针(2)
  • FreeRTOS学习笔记之内存管理
  • Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?
  • LeetCode 121. 买卖股票的最佳时机
  • Docker安装mysql、redis
  • 学习日志15 python
  • 深入理解Graphite协议:数据采集、存储与可视化的核心技术
  • [硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类
  • 65-OVP保护电路
  • 医学图像超分辨率重建深度学习模型开发报告
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • FNAF同人:简陋的测试
  • Pact 合约测试框架
  • 民法学学习笔记(个人向) Part.4
  • 20250720-5-Kubernetes 调度-污点与污点容忍_笔记
  • 力扣(LeetCode)第 459 场周赛
  • pthread_detach与pthread_join区别及使用场景
  • MySQL EXPLAIN 解读