如何将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
相关产品推荐
相关产品推荐

