如何在R中将长格式df转换为基因矩阵格式df2?
解决R数据框转换为基因矩阵格式的问题
问题背景
现有R数据框df,结构如下:
GeneIndex SampleIndex tpm GeneID GeneName <int> <int> <dbl> <chr> <chr> 1 0 3893 3.231526e-01 ENSG00000223972.5 DDX11L1 2 0 14906 0.000000e+00 ENSG00000223972.5 DDX11L1 3 0 7474 0.000000e+00 ENSG00000223972.5 DDX11L1 4 0 1220 3.824092e-29 ENSG00000223972.5 DDX11L1 5 0 15831 0.000000e+00 ENSG00000223972.5 DDX11L1 6 0 5471 1.445461e-01 ENSG00000223972.5 DDX11L1 ... ... ... .. .. ..
需要将其转换为基因矩阵格式df2,以GeneID为行名,SampleIndex为列名,对应位置保留原tpm值,示例如下:
GeneID 3893 14906 7474 1220 15831 5471 ENSG00000223972.5 3.231526e-01 0.000000e+00 0.000000e+00 3.824092e-29 0.000000e+00 1.445461e-01
解决方案
以下提供三种常用方法,可根据需求选择:
1. 基础R内置函数(无需额外安装包)
使用reshape()函数直接转换:
# 转换宽格式 df2 <- reshape(df, idvar = "GeneID", # 指定作为行标识的变量 timevar = "SampleIndex",# 指定作为列标识的变量 direction = "wide", # 设置转换方向为宽格式 v.names = "tpm") # 指定填充到矩阵中的数值变量 # 将GeneID设为行名,并移除原GeneID列 rownames(df2) <- df2$GeneID df2$GeneID <- NULL # 移除列名中的"tpm."前缀 colnames(df2) <- gsub("tpm\\.", "", colnames(df2))
2. tidyverse工具包(推荐,代码更简洁)
需先安装并加载tidyverse包,使用pivot_wider()实现转换:
# 首次使用需安装包 # install.packages("tidyverse") library(tidyverse) df2 <- df %>% # 仅保留需要的列,减少计算量 select(GeneID, SampleIndex, tpm) %>% # 转换宽格式:SampleIndex转为列名,tpm为对应单元格值 pivot_wider(names_from = SampleIndex, values_from = tpm) %>% # 将GeneID列转为行名 column_to_rownames(var = "GeneID")
3. reshape2包(经典数据重塑工具)
使用dcast()函数快速转换:
# 首次使用需安装包 # install.packages("reshape2") library(reshape2) # 直接转换为宽格式 df2 <- dcast(df, GeneID ~ SampleIndex, value.var = "tpm") # 将GeneID设为行名,并移除原GeneID列 rownames(df2) <- df2$GeneID df2$GeneID <- NULL
注意事项
如果存在同一GeneID对应同一SampleIndex有多个tpm值的情况,需要先做聚合处理(比如取均值、求和):
- 使用tidyverse时,可在
pivot_wider()中添加values_fn = mean(或sum等聚合函数) - 使用reshape2时,可在
dcast()中添加fun.aggregate = mean
内容的提问来源于stack exchange,提问作者rdzvr
相关产品推荐
相关产品推荐

