R语言表格列转行方法及合并同样本ID的SNP数据求助
R语言数据处理:列转行 + 合并同ID多行填充NA
一、列转行操作(宽表转长表)
用tidyr包的pivot_longer函数就能快速实现宽表转长表,示例如下:
先构造一个宽表示例:
wide_df <- data.frame( Sample.ID = c(39, 40), SNP1 = c("GG", "CC"), SNP2 = c("CC", NA), SNP3 = c(NA, "TT"), SNP4 = c("TT", NA), SNP5 = c(NA, NA) )
执行列转行:
library(tidyr) long_df <- pivot_longer( wide_df, cols = starts_with("SNP"), # 选中所有以SNP开头的列 names_to = "SNP_Type", # 原列名存入新列SNP_Type values_to = "Genotype", # 原列值存入新列Genotype values_drop_na = TRUE # 可选:自动剔除含NA的行 )
处理后的数据每行对应一个样本的单个SNP信息。
二、合并同Sample.ID多行,填充SNP列非NA值
针对同一Sample.ID对应多行、每行仅单个SNP列有值的情况,用dplyr包分组聚合即可解决:
先构造符合描述的原始数据:
raw_df <- data.frame( Sample.ID = c(39, 39, 39, 40, 40), SNP1 = c("GG", NA, NA, "CC", NA), SNP2 = c(NA, "CC", NA, NA, NA), SNP3 = c(NA, NA, NA, NA, "TT"), SNP4 = c(NA, NA, "TT", NA, NA), SNP5 = rep(NA, 5) )
执行合并操作:
library(dplyr) merged_df <- raw_df %>% group_by(Sample.ID) %>% summarise(across(starts_with("SNP"), ~ first(na.omit(.x)))) %>% ungroup()
代码说明:
group_by(Sample.ID):按样本ID分组across(starts_with("SNP"), ~ first(na.omit(.x))):遍历所有SNP列,提取每组内该列的第一个非NA值(每组内每个SNP列仅存在一个有效值)ungroup():取消分组,恢复普通数据框格式
最终得到的merged_df就是每个Sample.ID一行、所有SNP列填充对应有效值的结果。
内容的提问来源于stack exchange,提问作者sai
相关产品推荐
相关产品推荐

