如何在R中将多指标长格式基因型数据表转换为宽格式
如何在R中将长格式数据转换为多变量宽格式?
问题背景
我有一个Excel文件,表头为trait、genotype_id、BLUE、BLUE_SE、BLUP、BLUP_SE和heritability。除trait列外,所有列均为数值型,trait列包含Fe、Zn、S三种性状,对应三组数据上下排列。我希望按genotype_id汇总数据,得到如genotype_id、BLUE_Fe、BLUE_Zn、BLUE_S、BLUE_SE_Fe等格式的宽表,以便后续在R中构建相关矩阵。
我尝试了以下代码:
data_wide <- spread(allBLUEs, trait, BLUE)
但该代码仅能将BLUE列转换到同一行。我又尝试:
data_wide <- spread(allBLUEs, key = trait, value = c(BLUE, BLUE_SE, BLUP, BLUP_SE, heritability), sep = "_")
但发现spread函数的value参数似乎仅支持单个列?
示例数据如下:
df=tribble(~trait,~genotype_id,~BLUE,~BLUE_SE,~ BLUP,~BLUP_SE,~ heritability, "Fe", 3, 47.2, 2.13, 43.0, 1.76, 0.685, "Fe", 386, 42.5, 2.13, 39.8, 1.76, 0.685, "Zn", 3, 24.4, 1.74, 23.6, 1.18, 0.456, "S", 386, 1253, 51.3, 1269, 38.0, 0.545)
解决方案
你说得没错,spread函数确实只支持单个值列的转换,想要一次性处理多列,推荐使用tidyr包中的pivot_wider函数——这是spread的升级版,专门支持多值列的宽格式转换。
步骤1:加载必要的包
首先确保你已经安装并加载了tidyverse(包含tidyr):
library(tidyverse)
步骤2:使用pivot_wider转换格式
直接调用pivot_wider,指定核心参数即可完成转换:
data_wide <- df %>% pivot_wider( id_cols = genotype_id, # 按genotype_id分组汇总 names_from = trait, # 用trait的值作为新列名的后缀 values_from = c(BLUE, BLUE_SE, BLUP, BLUP_SE, heritability), # 需要转换的所有数值列 names_sep = "_" # 列名的分隔符,生成如BLUE_Fe的格式 )
转换后的结果
运行上述代码后,会得到符合需求的宽格式数据:
| genotype_id | BLUE_Fe | BLUE_Zn | BLUE_S | BLUE_SE_Fe | BLUE_SE_Zn | BLUE_SE_S | BLUP_Fe | BLUP_Zn | BLUP_S | BLUP_SE_Fe | BLUP_SE_Zn | BLUP_SE_S | heritability_Fe | heritability_Zn | heritability_S |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 47.2 | 24.4 | NA | 2.13 | 1.74 | NA | 43.0 | 23.6 | NA | 1.76 | 1.18 | NA | 0.685 | 0.456 | NA |
| 386 | 42.5 | NA | 1253 | 2.13 | NA | 51.3 | 39.8 | NA | 1269 | 1.76 | NA | 38.0 | 0.685 | NA | 0.545 |
缺失的性状会自动填充为NA,完全满足后续构建相关矩阵的需求。
内容的提问来源于stack exchange,提问作者mikki
相关产品推荐
相关产品推荐

