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

`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.xdnf.cn/news/15865.html

相关文章:

  • 【HarmonyOS】ArkUI - 自定义组件和结构重用
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • Spring AI 聊天记忆
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • Spring Boot 配置文件解析
  • SpringBoot集成MyBatis的SQL拦截器实战
  • Java学习第六十部分——JVM
  • [硬件电路-52]:什么是模拟电路与数字电路;它们的共同点、核心差异点(原理、目标、关注点等)以及它们如何相互转化
  • LeetCode 852:山脉数组的峰顶索引解析与实现
  • STM32CubeMX的一些操作步骤的作用
  • 7-20 关于mysql
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • 【硬件】GalaxyTabPro10.1(SM-T520)刷机/TWRP/LineageOS14/安卓7升级小白向保姆教程
  • RxSwift-事件属性
  • JVM-Java
  • LINUX(三)文件I/O、对文件打开、读、写、偏移量
  • 股票及金融笔记
  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)
  • 双8无碳小车“cad【17张】三维图+设计说名书
  • 【橘子分布式】gRPC(编程篇-下)
  • 嵌入式硬件篇---机械臂运动学解算(3自由度)
  • 机器学习-数据预处理
  • 【机器学习【9】】评估算法:数据集划分与算法泛化能力评估
  • 物联网安装调试-继电器
  • Java设计模式之行为型模式(备忘录模式)实现方式与测试用例
  • 【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)
  • 第四次作业
  • haproxy七层代理
  • 嵌入式硬件篇---继电器
  • C#.NET EFCore.BulkExtensions 扩展详解