玩转数据:长宽变换
点击上方 “趣味数据周刊” 关注公众号
文章期号:20200328
玩转数据,从这里开始
1,玩转的原则
玩转(整理)数据的原则是明确的:让数据变的更好用(符合下层函数参数的格式要求),方便用户查找和阅读。简而言之:易阅读,方便用。数据的整理是一个从数据框的统计结构(变量与观察值)到形式结构(列与行)的映射。它主要遵循两个准则:
1,每一列代表一个变量(属性)。
2,每一行代表一个观察值(对象)。
2,什么是长数据与宽数据
可以看出下图数据是一样的,长是行数的体现,宽是列数的体现,长宽是同数据的表现点在行列的不同,是长宽比较的结果。3,十八般武艺
既然我们知道了什么是长数据和宽数据,接下来我们一起学习一样长宽变换的十八般武艺吧。数据我们就用这个上图的数据。班级=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)
)
# 宽变长
short2long = melt(data, id=c("班级","姓名"),
variable.name= '科目', value.name = '成绩')
#长变宽
long2short = dcast(short2long,班级+姓名~科目)
short2long = gather(data,key=科目,value=成绩, 语文:综合)
long2short = spread(short2long,key=科目,value=成绩)
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 班级,姓名
")
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"))