R语言进行长宽数据转换

文章介绍了在R语言中使用tidyr的gather和spread函数以及reshape2的melt和dcast函数进行数据的宽转长和长转宽操作。通过示例展示了转换过程,并对比了大样本量下的运算速度,发现在宽转长时melt更快,而在长转宽时spread更高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

长宽数据

在日常数据分析过程中,经常会对数据进行长宽转换处理,所谓长宽数据转换就是将数据表中的列变量进行聚合和分裂操作。宽转长:多个列聚合为一列,同时生成value值,这种操作主要是为了方便ggplot2绘图;长转宽:单个列分裂为多个列,同时生成variable变量,这种操作通常是为了导入spss进行统计分析。通常用来执行转换操作的软件包有两种,一种是tidyr包中的gather和sperad函数,一种是reshape2包中的melt和dcast函数,下面就让我们来对这两种方式进行测试比较。

宽转长

转换前数据

(例:宽数据,数据表中存在多个列变量)
在这里插入图片描述

转换过程

#############################长宽数据相互转换##############
rm(list = ls())
###生成测试数据###
test<-matrix(c(1201001:1201100,paste0("name",seq(1:100)),round(runif(900,80,100))),100,11,dimnames = list(c(),c("学号","姓名","数学","语文","英语","物理","化学","生物","历史","地理","政治")))%>%data.frame()
###分别载入两个软件包###
library(tidyr)
library(reshape2)
###gather函数与melt函数在宽数据转长数据处理中的应用比较####
###测试结果###
gather(test,科目,分数,names(test)[3:11])%>%head()
melt(test,id=c("学号","姓名"),variable.name = "科目",value.name = "分数")%>%head()

转换后数据

在这里插入图片描述
可以看出转换后各个列变量聚合到了“科目”变量下,同时将value值赋到了“分数”变量下;两个函数运算结果无差别,下面尝试用大样本量测试运算速度。

运算速度比较

###大样本测试运算速度###
test<-matrix(c(12010001:12018000,paste0("name",seq(1:8000)),round(runif(72000,80,100))),8000,11,dimnames = list(c(),c("学号","姓名","数学","语文","英语","物理","化学","生物","历史","地理","政治")))%>%data.frame()
gather(test,科目,分数,names(test)[3:11])%>%system.time()
melt(test,id=c("学号","姓名"),variable.name = "科目",value.name = "分数")%>%system.time()

可以看出在进行大样本量宽转长数据处理时melt函数用时更少
在这里插入图片描述

长转宽

转换前后数据同“宽转长”相反,图片不再展示

转换过程及输出结果

###spread函数与dcast函数在长数据转宽数据处理中的应用比较#####
test<-matrix(c(12010001:12018000,paste0("name",seq(1:8000)),round(runif(72000,80,100))),8000,11,dimnames = list(c(),c("学号","姓名","数学","语文","英语","物理","化学","生物","历史","地理","政治")))%>%data.frame()
py<-melt(test,id=c("学号","姓名"),variable.name = "科目",value.name = "分数")
###测试结果###
spread(py,科目,value=分数)%>%head()
dcast(py,学号+姓名~科目)%>%head()
###大样本测试运算速度###
spread(py,科目,value=分数)%>%system.time()
dcast(py,学号+姓名~科目)%>%system.time()

可以看出在进行大样本量长转宽数据处理时spread函数用时更少
在这里插入图片描述

综上在进行长宽数据转换时可根据自身需要选取相应的函数

https://gitee.com/zhjx19/tidyverse120

<think>好的,我现在需要帮助用户了解R语言数据转换的方法,特别是使用dplyr和tidyr包的函数。首先,我得回忆一下这两个包的主要功能。dplyr主要用于数据操作,比如筛选、排序、汇总等,而tidyr专注于数据重塑,尤其是长格式和宽格式之间的转换。 用户提到了数据转换的方法或函数,可能包括数据筛选、排序、聚合以及长宽数据转换。根据提供的引用,特别是引用[2]、[3]、[4],其中提到了pivot_wider()函数的使用,还有示例数据集。我需要确保覆盖这些内容,并提供清晰的示例。 首先,我应该介绍dplyr的基本数据操作函数,比如filter()、select()、mutate()、arrange()和summarize(),这些都是常用的数据转换函数。然后转到tidyr的pivot_longer()和pivot_wider(),这两个函数在数据重塑中非常重要。需要给出具体的代码示例,帮助用户理解如何应用。 用户提供的引用中有示例数据集sales_data,这个数据集包括customer_id、product_type和sales_quantity。我可以用这个数据集来演示各种函数的用法。比如,使用filter()筛选product_type为A的记录,用mutate()添加新列,用group_by()和summarize()进行聚合计算。 在长宽数据转换部分,需要详细解释pivot_longer()如何将数据从宽变长,pivot_wider()如何将长数据变宽。根据引用[4]中的例子,可能需要使用month作为列名,但原示例数据集中没有month字段,可能需要调整或者假设一个场景。或者,可能需要使用提供的sales_data示例,并扩展它,添加时间或其他维度,以展示转换过程。 另外,用户提供的引用[3]和[4]都涉及到了pivot_wider()的使用,特别是引用[4]中的转换示例。我需要确保示例代码正确,并且语法符合要求,比如使用%>%管道操作符,正确指定names_from和values_from参数。 还需要注意,回答中引用的部分要自然地添加引用标识,例如在提到pivot_wider()时引用[2]和[4]。同时,按照系统级指令,数学表达式要用$...$,但在这个问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值