数据重塑:长宽数据转换【基于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办公软件…...

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

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...