突发!员工跳楼!只拿低保工资!央企设计院集体罢工!

突发!北京某院集体罢工!

淄博向东,惠泊向西:在人民与人民币之间,惠泊停车选择了人民币

【少儿禁】马建《亮出你的舌苔或空空荡荡》

10部适合女性看的唯美情色电影

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

玩转数据:长宽变换

herain 数据指象 2022-07-01

点击上方 “趣味数据周刊” 关注公众号

文章期号:20200328

玩转数据,从这里开始

1,玩转的原则

玩转(整理)数据的原则是明确的:让数据变的更好用(符合下层函数参数的格式要求),方便用户查找和阅读。简而言之:易阅读,方便用。数据的整理是一个从数据框的统计结构(变量与观察值)到形式结构(列与行)的映射。

它主要遵循两个准则: 

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

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

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

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

长数据(指标类型)需要通过指标找到数值(小张,语文两个指标我们可以找到成绩 120);宽数据是一种笛卡尔积类型数据,是通过行列的交叉点得到数值(小张与语文的交叉点得到成绩 120)。

3,十八般武艺

既然我们知道了什么是长数据和宽数据,接下来我们一起学习一样长宽变换的十八般武艺吧。数据我们就用这个上图的数据。
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
library(reshape2)
# 宽变长
short2long = melt(data, id=c("班级","姓名"),
variable.name= '科目', value.name = '成绩')

#长变宽
long2short = dcast(short2long,班级+姓名~科目)
具体 dcast 的方法有汇总,求平均可以参考 R 官方文档。3.2 R语言tidyr包函数:gather,spread
library(tidyr)
short2long = gather(data,key=科目,value=成绩, 语文:综合)
long2short = spread(short2long,key=科目,value=成绩)
3.3 SQL方法
# 宽变长
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方法
import pandas as pd
import numpy as np
# 宽变长
short2long=data.melt(id_vars=["班级","姓名"],
var_name="科目", value_name="成绩")

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

4 总结

到此为止,我们学会了多种方法来完成数据长宽变化,基本可以满足我们大多数的数据处理需要,具体细节知识需要我们查看更多官方文档,相信你们遇到的问题文档中都有详细的解答。玩转数据的长宽变换对数据后续的可视化和建模都是重要的第一步。记住一句话:长数据容易绘制可视化图表,宽数据更容易阅读符合阅读习惯。
#长数据绘图
library(ggplot2)
ggplot(short2long, aes(科目,成绩, colour=姓名))+geom_point()
+theme(text = element_text(family="SimSun"))
这里纠正上期文章中数据的出入:
鹤岗哭诉:一个鬼城的诞生
2002年-2014年累计住宅993.5公顷,能满足100万人住房需求;
到19年累积1311.3公顷。对于100万人口的鹤岗来说早供过于求了。

推荐阅读:
各美其美:统计.分析.挖掘 不一样的美
C与Python之争:互联网大门的金钥匙
寻常概率的惊叹号!
文章底部点个「在看」,坚持为你创作!

文章有问题?点此查看未经处理的缓存