如何用R实现批量VCF文件自动化处理并转换为指定结构data.frame
R语言批量处理VCF文件自动化实现方案
原始需求
需要批量处理大量格式统一的.vcf文件,实现自动化处理流程,最终将每个VCF文件转换为指定结构的小型data.frame。
原始单文件处理代码如下:
library(dplyr) library(tidyr) df <- read.table("DNA_rep1.vcf", sep=" ") df$chromosome <- sub(pattern = "chr",replacement = "", df[,1]) df <- df %>% separate(V8,c("8.1", "8.2","8.3"), extra='drop') df <- df[,c(13,2,9,6)] df <- cbind(rep(29, nrow(df)), df)
具体改造要求
- 代码中固定的样本ID值29需要设置为函数参数,方便调用函数处理不同文件时自定义样本ID
- 最终生成的data.frame列名需按如下规则设置:
colnames(df) <- c("sample", "chromosome", "start", "end", "segVal")
- 每个文件生成的
data.frame需要按行追加合并到已有的汇总数据表中,实现类似prev.df <- rbind(prev.df, df)的效果。
最终实现方案
library(dplyr) library(tidyr) library(stringr) # 自定义VCF处理函数 vcf2cnv.df <- function(x){ a <- read.table(x, sep=" ") # 去除染色体编号前缀"chr" a$chromosome <- sub(pattern = "chr", replacement = "", a[,1]) # 拆分V8列提取所需信息 a <- a %>% separate(V8,c("8.1", "8.2","8.3"), extra='drop') # 筛选保留需要的列 a <- a %>% select(c(13,2,9,6)) # 从文件名提取数字生成样本ID y <- as.numeric((str_extract_all(x, pattern = "[0-9]", simplify = TRUE))) y <- paste(y, collapse = "") y <- as.numeric(gsub('.{1}$', '', y)) a <- cbind(rep(y, nrow(a)), a) # 设置标准列名 colnames(a) <- c("sample", "chromosome", "start", "end", "segVal") # 单个样本结果保存为csv write.csv(a, file = paste0(y, "_DNA_CopyNumberVariants.csv")) } ## 批量运行并合并所有结果 # 设置工作目录 setwd("/my/working/directory") # 匹配目录下所有vcf文件 file_vcf <- list.files(pattern = "*.vcf", full.names = TRUE) lapply(file_vcf, vcf2cnv.df) # 合并所有生成的csv文件为汇总表 file_csv <- list.files(pattern = "*.csv", full.names = TRUE) for (file in file_csv){ # 汇总表不存在则先创建 if (!exists("Colon_cnv")){ Colon_cnv <- read.csv(file, header=TRUE) } # 汇总表已存在则追加行 if (exists("Colon_cnv")){ temp_dataset <-read.csv(file, header=TRUE) Colon_cnv<-rbind(Colon_cnv, temp_dataset) rm(temp_dataset) } }
内容的提问来源于stack exchange,提问作者Pexav01
相关产品推荐
相关产品推荐

