数据重塑:长宽数据转换【基于tidyr】
在数据分析和可视化过程中,数据的组织形式直接影响着我们能够进行的分析类型和可视化效果。这里简单介绍两种常见的数据格式:长格式(Long Format)和宽格式(Wide Format),以及如何使用tidyr包进行转换。
什么是长格式和宽格式数据?
宽格式(Wide Format)
- 每个观测单位占用一行
- 每个变量占用一列
- 适合人类直观阅读
- 常见于Excel表格
例如,一个记录学生各科成绩的宽格式数据:
# 宽格式数据示例
student_scores_wide <- data.frame(student_id = c(1, 2, 3),math = c(85, 92, 78),english = c(92, 88, 95),science = c(90, 85, 88)
)
长格式(Long Format)
- 每个观测值占用一行
- 包含标识变量和值变量
- 适合统计分析和可视化
- 符合"整洁数据"原则
同样的数据在长格式下的表现:
# 长格式数据示例
student_scores_long <- data.frame(student_id = rep(1:3, each = 3),subject = rep(c("math", "english", "science"), 3),score = c(85, 92, 90, 92, 88, 85, 78, 95, 88)
)
为什么需要进行格式转换?
-
可视化需求:
- ggplot2更适合处理长格式数据
- 某些图形(如多系列折线图)需要长格式数据
-
统计分析:
- 许多统计函数需要特定格式的数据
- 长格式更适合进行分组统计和建模
-
数据整理:
- 不同来源的数据可能格式不同
- 需要统一格式进行合并或比较
使用tidyr进行转换
宽转长(Wide to Long)
使用 pivot_longer()
函数:
library(tidyr)
library(dplyr)# 创建示例数据
sales_wide <- data.frame(store = c("A", "B", "C"),jan = c(100, 120, 90),feb = c(110, 130, 95),mar = c(120, 140, 100)
)# 转换为长格式
sales_long <- sales_wide %>%pivot_longer(cols = jan:mar, # 要转换的列names_to = "month", # 新的分类变量名values_to = "sales" # 新的数值变量名)
长转宽(Long to Wide)
使用 pivot_wider()
函数:
# 转回宽格式
sales_wide_again <- sales_long %>%pivot_wider(names_from = month, # 作为新列名的变量values_from = sales # 填充值的来源变量)
实际案例:销售数据可视化
让我们通过一个完整的例子来展示数据转换和可视化的过程:
library(ggplot2)
library(tidyr)
library(dplyr)# 创建示例数据
sales_data <- data.frame(store = rep(c("Store A", "Store B"), each = 12),month = rep(1:12, 2),sales_2022 = c(100, 110, 120, 115, 125, 130, 140, 145, 135, 130, 120, 110,90, 95, 100, 105, 110, 115, 120, 125, 115, 110, 100, 95),sales_2023 = c(110, 120, 130, 125, 135, 140, 150, 155, 145, 140, 130, 120,100, 105, 110, 115, 120, 125, 130, 135, 125, 120, 110, 105)
)# 转换为长格式
sales_long <- sales_data %>%pivot_longer(cols = starts_with("sales"),names_to = "year",values_to = "sales",names_prefix = "sales_")# 创建可视化
ggplot(sales_long, aes(x = month, y = sales, color = year, linetype = store)) +geom_line() +geom_point() +scale_x_continuous(breaks = 1:12) +labs(title = "Monthly Sales Comparison by Store and Year",x = "Month",y = "Sales",color = "Year",linetype = "Store") +theme_minimal()
最佳实践建议
-
保持一致性:
- 在项目中统一使用相同的数据格式
- 建立清晰的数据处理流程
-
命名规范:
- 使用有意义的变量名
- 保持命名风格的一致性
-
数据质量:
- 转换前检查缺失值
- 验证转换后的数据完整性
-
文档记录:
- 记录数据转换的步骤
- 说明转换的原因和目的
常见问题解决
- 处理缺失值:
# 使用values_drop_na参数处理缺失值
pivot_longer(..., values_drop_na = TRUE)
- 处理多个标识符:
# 保持多个ID列不变
pivot_longer(..., id_cols = c("id1", "id2"))
- 处理复杂列名:
# 使用正则表达式处理列名
pivot_longer(cols = matches("\\d{4}"), # 匹配年份names_to = "year",values_to = "value"
)
总结
掌握长宽数据格式的转换是数据分析中的重要技能。通过tidyr包提供的工具,我们可以灵活地在不同格式之间转换,从而更好地满足分析和可视化的需求。记住,选择哪种格式主要取决于你的具体需求:
- 需要创建可视化?使用长格式
- 需要人工检查数据?使用宽格式
- 需要进行统计分析?根据具体分析方法选择合适的格式
相关文章:

数据重塑:长宽数据转换【基于tidyr】
在数据分析和可视化过程中,数据的组织形式直接影响着我们能够进行的分析类型和可视化效果。这里简单介绍两种常见的数据格式:长格式(Long Format)和宽格式(Wide Format),以及如何使用tidyr包进行…...

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL
随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…...

实验6记录网络与故障排除
实验6记录网络与故障排除 实验目的及要求: 通过实验,掌握如何利用文档记录网络设备相关信息并完成网络拓扑结构的绘制。能够使用各种技术和工具来找出连通性问题,使用文档来指导故障排除工作,确定具体的网络问题,实施…...

QEMU 模拟器中运行的 Linux 系统
这两个文件通常用于在 QEMU 模拟器中运行的 Linux 系统,具体作用如下: 1. linux-aarch64-qemu.ext4: - **文件类型**:这是一个文件系统镜像文件,通常是 ext4 文件系统格式。 - **作用**:它包含了 Li…...
Ceph PG(归置组)的状态说明
Ceph PG(Placement Group)的状态反映了Ceph集群中数据的健康状况和分布情况。以下是Ceph PG的一些常见状态: Creating:创建状态。在创建存储池时,会创建指定数量的归置组(PG)。Ceph在创建一或多…...

Docker使用docker-compose一键部署nacos、Mysql、redis
下面是一个简单的例子,展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1,准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…...
HTTP常见的状态码有哪些,都代表什么意思
HTTP 协议定义了一系列的状态码,用于描述服务器对客户端请求的处理结果。这些状态码分为五个类别,每个类别都有特定的用途。 常见状态码 1开头 信息性状态码 这些状态码表示请求已被接收,继续处理。 100 Continue:客户端应继续…...
WebKit的Windows接口(适用2024年11月份版)
WebKit的Windows接口 使用cairo作为图形后端,libcurl作为网络后端。并且它只支持64位的Windows。 安装开发工具 安装带有“使用c进行桌面开发”工作负载的最新Visual Studio。 Activate Developer Mode.激活开发者模式。Build-webkit脚本创建一个指向生成的comp…...

Android 最新的AndroidStudio引入依赖失败如何解决?如:Failed to resolve:xxxx
错误信息: 在引入依赖时报错:Failed to resolve: xxx.xxxx:1.1.0 解决方案: 需要修改maven库的代理,否则就需要翻墙编译 新的AndroidStudio版本比较坑,修改代理的位置发生了变化: 最新变化:…...

ue5 蓝图学习(一)结构体的使用
在内容浏览器中右键 蓝图-选择结构体 下面这东西就是结构体,和C的结构体差不多 双击一下 可以添加变量,设置变量的类型和默认值。 可以在关卡蓝图中调用它。 点击打开关卡蓝图,添加变量 在变量的右侧,变量类型里搜索strcut&#…...
docker--工作目录迁移
前言 安装docker,默认的情况容器的默认存储路径会存储系统盘的 /var/lib/docker 目录下,系统盘一般默认 50G,容器输出的所有的日志,文件,镜像,都会存在这个地方,时间久了就会占满系统盘。 一、…...

Golang | Leetcode Golang题解之第556题下一个更大元素III
题目: 题解: func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…...

2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我有大量的个人代码和应用托管在Github/Gitee这些代码仓库。当我想要部署这些代码到我的阿里云ECS服务器时,往往会很麻烦,主要问题有这些: 需要手动安装和配置git,过程非常繁琐。每次都需要登录到机器…...

2023.8 用于生物医学问答的选择性 UMLS 知识注入
Selective UMLS knowledge infusion for biomedical question answering Selective UMLS knowledge infusion for biomedical question answering | Scientific Reports 韩国首尔国立大学研究生院生物工程跨学科项目 问题 如何高效地将生物医学知识注入预训练语言模型&#x…...

chat2db调用ollama实现数据库的操作。
只试了mysql的调用。 其它的我也不用,本来想充钱算了。最后一看单位是美刀。就放弃了这分心。于是折腾了一下。 本地运行chat2db 及chat2db ui https://gitee.com/ooooinfo/Chat2DB clone 后运行起来 chat2db的java端,我现在搞不清这一个项目是有没有…...
Rust 生态系统的未来与学习方向
Rust 生态系统的未来与学习方向 Rust 作为一门系统编程语言,因其内存安全性、并发性能以及生态的不断壮大,已逐渐成为开发者和企业的首选语言之一。随着技术的进步,Rust 的生态系统持续发展,涉及多个领域,包括 Web 开…...

Vue的基础使用
一、为什么要学习Vue 1.前端必备技能 2.岗位多,绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能(Vue2Vue3) 二、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架…...
c++中,头文件包含iostream.h和`<iostream>`的差别
引言 在编写c代码时,有时候包含头文件iostream.h,有时候又包含<iostream>,初学者会对此感到很疑惑。 实际上,这两者是同一个头文件,只是包含方式不同,这是由于C的历史原因造成的,下面解释…...

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

软件工程笔记二—— 软件生存期模型
目录 瀑布模型 瀑布模型的特点 阶段间具有顺序性和依赖性。 推迟实现的观点 质量保证的观点 瀑布模型的优点 瀑布模型的缺点 快速原型模型 快速原型模型的优点 快速原型模型的缺点 增量模型 增量模型的优点 增量构件开发 螺旋模型 完整的螺旋模型(顺…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...