一、定义
R语言中,数据重塑(Data Reshaping)是指改变数据框(data frame)或类似结构(如矩阵、列表等)的形状,以适应不同的分析或可视化需求。这通常涉及行和列的重新排列、数据的汇总或拆分等操作。数据重塑是数据预处理中的一个重要步骤,特别是在数据分析和机器学习项目中,因为不同的算法和可视化工具对数据格式有不同的要求。
R语言中有几个常用的包和函数来进行数据重塑,其中最著名的是reshape2
包和tidyr
包。reshape2
包提供了一系列函数来处理宽格式(wide format)数据和长格式(long format)数据之间的转换,而tidyr
包(作为tidyverse
生态系统的一部分)则提供了更现代、更直观的接口来进行类似的操作。
宽格式(Wide Format)数据:每个变量占据一列,观测值占据一行,但是一个观测单元(如一个实验对象或时间点)的多个测量值分布在多列中。例如,一个包含不同时间点测量值的数据集,每个时间点可能都有自己的列。简单理解为,每一行代表对一个事物的观测。
长格式(Long Format)数据:每行代表一个观测单元的一个测量值,变量和观测值分别占据列。这种格式通常更适合于数据分析和可视化,因为它使得每个观测单元的所有测量值都在同一行中,便于处理。简单理解为,用多行来表示对同一事物的观测。
二、reshape2包
1、melt()函数
用于将宽数据变为长数据。
library(reshape2)
# 现有一个宽格式数据框
df <- data.frame(
ID = 1:3,
Math = c(85, 90, 78),
English = c(88, 76, 92)
)
df
将宽数据转换成长数据:
4个参数详解:
id.vars:表示需要作为id的列名,指定后,这些列将保持不变;
measure.vars:表示需要进行合并的列。R语言默认将那些没有作为id的所有列进行合并,也可以选择其中部分列进行合并;
variable.name:表示合并后分类变量列的名称,默认为variable;
value.name:表示合并后数值列的名称,默认为value。
# 使用melt()转换为长格式数据
long_df <- melt(df, id.vars = "ID", measure.vars = c("Math", "English"),
variable.name = "Subject", value.name = "Score")
# 查看转换后的长格式数据框
long_df
2、dcast()函数
用于将长数据转换为宽数据。
library(reshape2)
# 长格式数据框
long_df <- data.frame(
ID = rep(1:3, each = 2),
Subject = rep(c("Math", "English"), times = 3),
Score = c(85, 88, 90, 76, 78, 92)
)
long_df
将长数据转换为宽数据
ID ~ Subject:这是一个formula表达式,~ 前面的部分表示维持原样的列,~ 后面的部分表示需要拆分或拉长为若干列的分类列;
value.var:表示需要拆分或拉长为若干列的数值列,如没有指定,则默认按照reshape2包中的guess_value()函数进行猜测。
# 使用dcast()转换为宽格式
wide_df <- dcast(long_df, ID ~ Subject, value.var = "Score")
# 查看转换后的宽格式数据框
wide_df
dcast()函数还有一个很重要的参数:fun.aggregate。此参数的作用是当每个单元格的值不唯一时,决定该采取哪种聚合方式。如果没有设定此参数,并且重铸后每个单元格的值又不唯一,那么它将默认计算这些值的个数,同时抛出一条警告。
# 假设我们只关心每个科目的一个学生(为了演示,我们删除一行)
long_df_modified <- long_df[-2, ] # 删除第二行
long_df_modified
# 使用dcast()并指定聚合函数为mean来计算平均成绩
wide_df_mean <- dcast(long_df_modified, ID ~ Subject, value.var = "Score", fun.aggregate = mean)
# 查看转换后的宽格式数据框(使用平均值)
wide_df_mean