2020-11-11 06:09:25
数据长宽变换是数据处理中常见的操作,旨在调整数据结构以满足不同分析需求,其核心原则是让数据更易阅读和使用,主要涉及长数据与宽数据两种形式间的转换,可通过R、SQL、Python等多种工具实现。
玩转数据的原则每一列代表一个变量(属性)。
每一行代表一个观察值(对象)。
指标类型数据,通过指标找到数值。例如,小张,语文两个指标可以找到成绩120。
行数较多,列数较少。

笛卡尔积类型数据,通过行列的交叉点得到数值。例如,小张与语文的交叉点得到成绩120。
列数较多,行数较少。
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=成绩)宽变长:
使用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 班级,姓名")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"))