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

在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_idis_severe_0_encoding_1is_severe_0_encoding_2is_severe_0_encoding_0is_severe_1_encoding_1is_severe_1_encoding_2is_severe_1_encoding_0chisqpvalueAF_TOTALAF_latinREFALT
chr21-10139833-A-C01700131.706250.1910.40.3AC
chr21-10141374-T-C01700131.706250.1910.50.2TC

针对元数据存在差异的情况

如果同一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:15:19