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

使用dplyr转换Dataframe:按SNP分组重组基因与得分列

使用dplyr转换Dataframe结构

问题背景

现有如下结构的Dataframe:

Gene        SNP  Score
1     AKT3  rs2220276 6.5091
2 ARHGAP44  rs2220276 4.7194
3   BRINP2 rs16851037 3.2606
4 C12orf42 rs16851037 3.2563
5  CCDC122 rs11619756 4.3142
6   CCDC68 rs11619756 2.3614

希望转换为以下结构,将每个SNP对应的基因和分数拆分为对应列:

Gene 1         SNP  Gene 1 Score       Gene 2   Gene 2 Score      
1     AKT3  rs2220276        6.5091     ARHGAP44         4.7194 
2   BRINP2 rs16851037        3.2606     C12orf42         3.2563
5  CCDC122 rs11619756        4.3142       CCDC68         2.3614

原始Dataframe创建代码:

df <- data.frame(Gene = c("AKT3", "ARHGAP44", "BRINP2", "C12orf42", "CCDC122","CCDC68")  , 
           "SNP" = c("rs2220276", "rs2220276", "rs16851037", "rs16851037","rs11619756", "rs11619756"),
           Score = c(6.5091, 4.7194, 3.2606, 3.2563, 4.3142, 2.3614))

解决方案(使用dplyr)

可以通过分组标记序号,再将长格式数据转为宽格式实现:

library(dplyr)
library(tidyr)

df_transformed <- df %>%
  # 按SNP分组,给每组内的行添加1、2的序号标记
  group_by(SNP) %>%
  mutate(group_id = row_number()) %>%
  ungroup() %>%
  # 转换为宽格式,拆分Gene和Score列
  pivot_wider(
    id_cols = SNP,
    names_from = group_id,
    values_from = c(Gene, Score),
    # 自定义列名格式
    names_glue = "{.value} {names_from}"
  ) %>%
  # 调整列顺序匹配目标结构
  select(`Gene 1`, SNP, `Gene 1 Score`, `Gene 2`, `Gene 2 Score`)

代码说明

  • group_by(SNP) %>% mutate(group_id = row_number()):给每个SNP组内的两行分别标记序号,为后续拆分列提供依据。
  • pivot_wider:将长格式数据转为宽格式,把Gene和Score按序号拆分为独立列,并通过names_glue设置符合需求的列名。
  • select:重新排列列的顺序,和目标结构一致。

运行上述代码后即可得到所需的Dataframe结构。


内容的提问来源于stack exchange,提问作者Workhorse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:15:18