使用pivot_longer将GVCF样本及基因型多列数据转为长表的问题
解决方案
你可以通过先统一重命名非固定列、再做长宽转换的方式实现需求,该方案不受真实数据集不规则列名的影响,且属于向量化操作,处理大体积数据的效率远高于手动写for循环。
操作代码
library(tidyverse) # 设定前4列为公共固定字段 fixed_col_index <- 1:4 # 提取非固定列的索引 unfixed_col_index <- setdiff(seq_len(ncol(df)), fixed_col_index) # 按成对顺序给非固定列重命名:奇数位为样本名列、偶数位为基因型列 pair_num <- length(unfixed_col_index) %/% 2 new_unfixed_colnames <- paste0(rep(c("sample_name_", "genotype_"), pair_num), rep(seq_len(pair_num), each = 2)) colnames(df)[unfixed_col_index] <- new_unfixed_colnames # 一键转换为目标长表格式 result_df <- df %>% pivot_longer( cols = -all_of(fixed_col_index), names_to = c(".value", "sample_group"), names_sep = "_" ) %>% # 如不需要样本分组序号可删除该列 select(-sample_group)
逻辑说明
- 不依赖原始列名匹配规则,仅按照列的位置对成对出现的样本名、基因型列进行统一重命名,完美适配你提到的真实数据不规则samp_id列名的场景。
- 借助
pivot_longer的.value参数直接将成对的列转换为对应的值列,转换后每一行对应一个位点+一个样本的组合,前4列为位点公共信息,后两列依次为样本名称、基因型信息。
内容的提问来源于stack exchange,提问作者Sebastian GM
相关产品推荐
相关产品推荐

