You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将R语言中的长格式数据表df转换为宽格式new.df?

将长格式数据表转换为宽格式(R语言)

原始数据与目标格式

先看你的原始长格式数据df和期望的宽格式数据new.df:

# 原始长格式数据
Name <- c("a1", "a1", "a1", "a2", "a2", "a2", "a3", "a3", "a3")
Absorbance <- c(25, 15, 20, 5, 10, 15, 50, 60, 40)
Wavelength <- c("One", "Two", "Three", "One", "Two", "Three", "One", "Two", "Three")
df <- data.frame(Name, Absorbance, Wavelength)

# 目标宽格式数据
New.name <- c("a1", "a2", "a3")
One <- c(25, 5, 50)
Two <- c(15, 10, 60)
Three <- c(20, 15, 40)
new.df <- data.frame(New.name, One, Two, Three)

解决方案

下面提供三种常用的转换方法,都能得到你想要的宽格式结果:

方法1:使用tidyverse的pivot_wider(推荐)

tidyr包中的pivot_wider是处理长转宽的便捷工具,代码可读性强:

# 加载tidyverse包
library(tidyverse)

# 转换为宽格式
result_df <- df %>% 
  pivot_wider(
    id_cols = Name,          # 作为行标识的列
    names_from = Wavelength, # 转为列名的字段
    values_from = Absorbance # 对应填充的值
  )

# 重命名第一列以匹配new.df的列名
colnames(result_df)[1] <- "New.name"

运行后result_df与new.df完全一致。

方法2:使用Base R的reshape函数

无需额外安装包,直接用R原生函数:

result_df <- reshape(
  data = df,
  idvar = "Name",
  timevar = "Wavelength",
  direction = "wide"
)

# 去掉列名中的"Absorbance."前缀,并重命名第一列
colnames(result_df) <- gsub("Absorbance.", "", colnames(result_df))
colnames(result_df)[1] <- "New.name"

方法3:使用data.table的dcast(适合大数据)

如果处理超大数据集,data.table的转换效率更高:

# 加载data.table包
library(data.table)

# 转换为data.table格式并进行宽转
dt <- as.data.table(df)
result_df <- dcast(dt, Name ~ Wavelength, value.var = "Absorbance")

# 重命名第一列
setnames(result_df, "Name", "New.name")

验证结果

可以用all.equal(result_df, new.df)验证转换结果与目标数据是否一致,返回TRUE说明转换成功。

内容的提问来源于stack exchange,提问作者Artūrs Katamadze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:41:14