在R语言中将长格式SNP数据转换为宽格式的方法求助
解决长格式SNP数据重塑为宽格式的问题
可以用tidyverse工具包中的pivot_longer和pivot_wider实现需求,以下是具体代码和步骤:
1. 加载依赖包
library(tidyverse)
2. 执行数据重塑
# 处理encoding列,生成带is_severe前缀的宽格式 df_encoding <- df %>% # 将三个encoding列转为长格式 pivot_longer(cols = starts_with("encoding_"), names_to = "encoding", values_to = "value") %>% # 拼接新列名:is_severe_<值>_<encoding列名> mutate(new_col = paste0("is_severe_", is_severe, "_", encoding)) %>% # 转回宽格式,每个snp_id对应一行 pivot_wider(id_cols = snp_id, names_from = new_col, values_from = value) # 提取每个snp_id的元数据(假设同一snp_id下元数据一致) df_metadata <- df %>% distinct(snp_id, .keep_all = TRUE) %>% select(snp_id, chisq, pvalue, AF_TOTAL, AF_latin, REF, ALT) # 合并encoding宽格式数据和元数据 final_df <- df_encoding %>% left_join(df_metadata, by = "snp_id")
3. 结果展示
最终输出的final_df结构完全符合需求:
| snp_id | is_severe_0_encoding_1 | is_severe_0_encoding_2 | is_severe_0_encoding_0 | is_severe_1_encoding_1 | is_severe_1_encoding_2 | is_severe_1_encoding_0 | chisq | pvalue | AF_TOTAL | AF_latin | REF | ALT |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| chr21-10139833-A-C | 0 | 1 | 7 | 0 | 0 | 13 | 1.70625 | 0.191 | 0.4 | 0.3 | A | C |
| chr21-10141374-T-C | 0 | 1 | 7 | 0 | 0 | 13 | 1.70625 | 0.191 | 0.5 | 0.2 | T | C |
针对元数据存在差异的情况
如果同一snp_id下的chisq、pvalue等字段存在不同值,可通过聚合函数处理,比如取均值:
df_metadata <- df %>% group_by(snp_id) %>% summarise( chisq = mean(chisq), # 可替换为max/min等聚合方式 pvalue = mean(pvalue), AF_TOTAL = first(AF_TOTAL), # 假设频率数据一致,取第一个值 AF_latin = first(AF_latin), REF = first(REF), ALT = first(ALT), .groups = "drop" )
内容的提问来源于stack exchange,提问作者agnesa rivkin
相关产品推荐
相关产品推荐

