前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转数据:长宽变换

玩转数据:长宽变换

作者头像
herain
发布2022-04-27 17:35:54
4920
发布2022-04-27 17:35:54
举报
文章被收录于专栏:数据指象

玩转数据,从这里开始

1,玩转的原则

玩转(整理)数据的原则是明确的:让数据变的更好用(符合下层函数参数的格式要求),方便用户查找和阅读。简而言之:易阅读,方便用。

数据的整理是一个从数据框的统计结构(变量与观察值)到形式结构(列与行)的映射。

它主要遵循两个准则:

1,每一列代表一个变量(属性)。

2,每一行代表一个观察值(对象)。

2,什么是长数据与宽数据

可以看出下图数据是一样的,长是行数的体现,宽是列数的体现,长宽是同数据的表现点在行列的不同,是长宽比较的结果。

长数据(指标类型)需要通过指标找到数值(小张,语文两个指标我们可以找到成绩 120);

宽数据是一种笛卡尔积类型数据,是通过行列的交叉点得到数值(小张与语文的交叉点得到成绩 120)。

3,十八般武艺

既然我们知道了什么是长数据和宽数据,接下来我们一起学习一样长宽变换的十八般武艺吧。

数据我们就用这个上图的数据。

代码语言:javascript
复制
data <- data.frame(
班级=c(1,1,1,2,2,2,3),
姓名=c('小张', '小红', '小李', '小王', '小陈', '小花', '小天'),
语文=c(120,110,109,135,120,110,98),
数学=c(140,139,129,135,121,109,150),
英语=c(111,123,141,101,99,130,140),
综合=c(125,115,119,130,121,113,130)
)

3.1 R方法reshape2包函数melt,dcast

代码语言:javascript
复制
library(reshape2)
# 宽变长
short2long = melt(data, id=c("班级","姓名"),
variable.name= '科目', value.name = '成绩')

#长变宽
long2short = dcast(short2long,班级+姓名~科目)

具体 dcast 的方法有汇总,求平均可以参考 R 官方文档。

3.2 R语言tidyr包函数:gather,spread

代码语言:javascript
复制
library(tidyr)
short2long = gather(data,key=科目,value=成绩, 语文:综合)
long2short = spread(short2long,key=科目,value=成绩)

3.3 SQL方法

代码语言:javascript
复制
# 宽变长
short2long  = sqldf("
 select 班级, 姓名, '语文' as 科目, 语文 as 成绩 from data
 union all
 select 班级, 姓名, '数学' as 科目, 数学 as 成绩 from data
 union all
 select 班级, 姓名, '英语' as 科目, 英语 as 成绩 from data
 union all
 select 班级, 姓名, '综合' as 科目, 综合 as 成绩 from data")

#长变宽
long2short = sqldf("
select
班级,姓名,
max(case 科目 when '语文' then 成绩 else 0 end) as 语文,
max(case 科目 when '数学' then 成绩 else 0 end) as 数学,
max(case 科目 when '英语' then 成绩 else 0 end) as 英语,
max(case 科目 when '综合' then 成绩 else 0 end) as 综合
from short2long
group by  班级,姓名
")

SQL 主要用 case,if 将行变列;主要用 union all , ateral view explod (类似 left join)列变行。

3.4 Python方法

代码语言:javascript
复制
import pandas as pd
import numpy as np
# 宽变长
short2long=data.melt(id_vars=["班级","姓名"],
var_name="科目", value_name="成绩")

#长变宽
long2short.pivot_table(index=["班级","姓名"],
columns=["科目"], values=["成绩"])

4 总结

到此为止,我们学会了多种方法来完成数据长宽变化,基本可以满足我们大多数的数据处理需要,具体细节知识需要我们查看更多官方文档,相信你们遇到的问题文档中都有详细的解答。玩转数据的长宽变换对数据后续的可视化和建模都是重要的第一步。

记住一句话:长数据容易绘制可视化图表,宽数据更容易阅读符合阅读习惯。

代码语言:javascript
复制
#长数据绘图
library(ggplot2)
ggplot(short2long, aes(科目,成绩, colour=姓名))+geom_point()
+theme(text = element_text(family="SimSun"))

这里纠正上期文章中数据的出入:

鹤岗哭诉:一个鬼城的诞生

2002年-2014年累计住宅993.5公顷,能满足100万人住房需求;

到19年累积1311.3公顷。对于100万人口的鹤岗来说早供过于求了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据指象 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,玩转的原则
  • 2,什么是长数据与宽数据
  • 3,十八般武艺
  • 4 总结
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档