【教你R语言】转换长宽格式表的落地方案

2019-05-22 20:51:53 浏览数 (1)

前言

做数据分析以及制作表格的时候,会遇到长宽格式数据之间相互转换的问题,之前介绍了如果在Hive是使用sql语句实现,现介绍一下如何在R语言中实现长宽格式数据相互转换。

【Hive】实现长格式数据转换成宽格式数据

【Hive】实现宽格式数据转换成长格式数据

长宽格式数据

之前在【Hive】实现长格式数据转换成宽格式数据举了一个栗子:

宽格式数据:每个变量单独成一列为宽格式数据,变量的所有属性都在同一行。

长格式数据:长数据中变量的ID没有单独列成一列,而是整合在同一列。

需求描述

下面左右两种长宽格式数据相互转换:

需求实现

R语言中有两个包中的函数可以实现长宽格式数据的相关转换:

数据准备 ##长格式数据data <- data.frame( user_no = rep(c("u001", "u002", "u003"), each = 6), message = rep(c("name", "age", "sex", "education", "regtime", "first_buytime"), times = 3), detail = c("Sulie", "25", "male", "master", "2018/1/2", "2018/1/3", "LuBan", "30", "male", "Bachelor", "2018/3/4", "2018/5/5", "ZhenJi", "27", "female", "PhD", "2018/4/3","2018/5/4")) ##宽格式数据data1 <- data.frame( user_no = c("u001", "u002", "u003"), name = c("SuLie", "LuBan", "ZhenJi"), sex = c("male", "male", "female"), age = c(25, 30, 27), education = c("master", "Bachelor", "PhD"), regtime = c("2018/1/2", "2018/3/4", "2018/4/3"), first_buytime = c("2018/1/3", "2018/5/5", "2018/5/4"))

reshape2包实现长宽数据转换

  • ##长格式数据转换成宽格式数据library(reshape2)library(dplyr) dcast( data = data, user_no ~ message ##左侧是要保留的字段,右侧是要分割的字段,可以理解为key ##这样汇总的就是value值了) ##宽格式数据转换成长格式数据melt(data1, id.vars=c("user_no"), ##要保留的字段 variable.name = "message", #理解为key value.name = "detail" #理解为value) %>% arrange(user_no)

tidyr包实现长宽数据转换

代码语言:javascript复制
##长格式数据转换成宽格式数据library(tidyr)library(dplyr)spread(  data = data,  key = "message", ##key键,原来表中字段  value = "detail" ##value值,原来表中字段)##宽格式数据转换成长格式数据gather(  data = data1,  key = "message",  ##key键,新增字段  value = "detail", ##value值,新增字段  name:first_buytime ) %>%   arrange(user_no)

运行结果:

长格式数据转换成宽格式数据运行结果

宽格式数据转换成长格式数据运行结果

总结

R语言reshap2和tidyr包都可以实现长宽格式数据相互转换,相比较而言,更喜欢tidyr包中的实现方式,与Hive中类似,中间过渡map格式类型数据,key键和value值明确,结合sql中map格式数据更容易理解R语言tidyr包中实现方式。

0 人点赞