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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:48:21