玩转数据:长宽变换

2022-04-27 17:35:54 浏览数 (1)

玩转数据,从这里开始

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万人口的鹤岗来说早供过于求了。

0 人点赞