使用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
相关产品推荐
相关产品推荐

