玩转数据:长宽变换

玩转数据:长宽变换
最新回答
随风而去

2020-11-11 06:09:25

数据长宽变换是数据处理中常见的操作,旨在调整数据结构以满足不同分析需求,其核心原则是让数据更易阅读和使用,主要涉及长数据与宽数据两种形式间的转换,可通过R、SQL、Python等多种工具实现。

玩转数据的原则
  • 目的:让数据变得更好用,符合下层函数参数的格式要求,方便用户查找和阅读。
  • 数据整理的本质:从数据框的统计结构(变量与观察值)到形式结构(列与行)的映射。
  • 遵循准则

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

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

长数据与宽数据的定义
  • 长数据

    指标类型数据,通过指标找到数值。例如,小张,语文两个指标可以找到成绩120。

    行数较多,列数较少。

  • 宽数据

    笛卡尔积类型数据,通过行列的交叉点得到数值。例如,小张与语文的交叉点得到成绩120。

    列数较多,行数较少。

长宽变换的方法R方法
  • reshape2包

    melt函数(宽变长)

    示例代码:

    library(reshape2)short2long = melt(data, id=c("班级","姓名"), variable.name = '科目', value.name = '成绩')

    dcast函数(长变宽)

    示例代码:

    long2short = dcast(short2long,班级+姓名~科目)
  • tidyr包

    gather函数(宽变长)

    示例代码:

    library(tidyr)short2long = gather(data,key=科目,value=成绩, 语文:综合)

    spread函数(长变宽)

    示例代码:

    long2short = spread(short2long,key=科目,value=成绩)
SQL方法
  • 宽变长

    使用UNION ALL将不同科目的成绩合并为长数据。

    示例代码:

    short2long = sqldf("select 班级, 姓名, '语文' as 科目, 语文 as 成绩 from dataunion allselect 班级, 姓名, '数学' as 科目, 数学 as 成绩 from dataunion allselect 班级, 姓名, '英语' as 科目, 英语 as 成绩 from dataunion allselect 班级, 姓名, '综合' as 科目, 综合 as 成绩 from data")
  • 长变宽

    使用CASE WHEN语句将长数据中的科目转换为列。

    示例代码:

    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 short2longgroup by 班级,姓名")
Python方法
  • pandas库

    melt函数(宽变长)

    示例代码:

    import pandas as pdshort2long=data.melt(id_vars=["班级","姓名"], var_name="科目", value_name="成绩")

    pivot_table函数(长变宽)

    示例代码:

    long2short.pivot_table(index=["班级","姓名"], columns=["科目"], values=["成绩"])
长宽数据的应用特点
  • 宽数据:容易绘制可视化图表,适合进行直观的数据展示。
  • 长数据

    更容易阅读,符合阅读习惯。

    示例绘图代码(R语言ggplot2包):

    library(ggplot2)ggplot(short2long, aes(科目,成绩, colour=姓名))+geom_point()+theme(text = element_text(family="SimSun"))

总结
  • 掌握了多种数据长宽变换的方法,可以满足大多数数据处理需求。
  • 具体细节知识需要查看更多官方文档,以应对遇到的各种问题。
  • 数据长宽变换是数据可视化和建模的重要第一步,对后续分析工作至关重要。