Bootstrap

【R语言】数据重塑

一、定义

R语言中,数据重塑(Data Reshaping)是指改变数据框(data frame)或类似结构(如矩阵、列表等)的形状,以适应不同的分析或可视化需求。这通常涉及行和列的重新排列、数据的汇总或拆分等操作。数据重塑是数据预处理中的一个重要步骤,特别是在数据分析和机器学习项目中,因为不同的算法和可视化工具对数据格式有不同的要求。

R语言中有几个常用的包和函数来进行数据重塑,其中最著名的是reshape2tidyrreshape2包提供了一系列函数来处理宽格式(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

 

;