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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:21:07