如何修改R代码为5个基因分别生成SNP分布饼图PDF
问题修正方案
你的代码只生成一个饼图的核心原因是循环逻辑错误,以下是具体问题和修正后的代码:
原代码的关键错误
- 外层循环变量
i被内层循环重名覆盖,导致循环无法正常遍历所有5个基因 gename <- gene[g]每次都取全部5个基因的名称,而非当前循环的单个基因- PDF文件名拼接错误,
paste0不需要单独传sep参数
修正后的代码
set.seed(5) library(dplyr) library(tidyverse) library(tibble) # 读取数据 gene_exp <- read.table(file = "chr22_gene.txt", header = TRUE, sep = "\t" ) # 随机选5个基因的索引 g <- round(runif(5, 1, dim(gene_exp)[1])) # 提取所有基因名 gene <- sapply(strsplit(rownames(gene_exp),"_"), `[`, 2) # 外层循环遍历每个选中的基因索引,变量用idx避免和内层冲突 for(idx in g){ # 取当前循环的单个基因名 gename <- gene[idx] # 筛选当前基因的数据 gene1 <- gene_exp %>% rownames_to_column() %>% separate(rowname, into = c(NA, 'gene_name'), sep = '_') %>% filter(gene_name == gename) # 提取rsid,内层循环用j作为变量,避免覆盖外层的idx rsid_list <- NULL snp <- strsplit(rownames(gene_exp), "_") for(j in 1:nrow(gene1)){ value <- snp[[j]][1] rsid_list <- rbind(rsid_list, value) } rownames(gene1) <- rsid_list gene1 <- gene1[,-c(1)] # 生成对应基因的PDF文件,修正文件名拼接 pdf(paste0("rplot_", genename, ".pdf")) # 注意:确保one_tissueonly和samesnp_difft是当前基因对应的数据集 # 如果这两个对象是基于gene1计算的,需要在这里补充计算逻辑 snp_onetissue <- nrow(one_tissueonly) snp_difftissue <- nrow(samesnp_difft) x <- c(snp_onetissue, snp_difftissue) labels <- c("onesnp_onetissue", "samesnp_differentissue") pct <- round(x/sum(x)*100) lbls <- paste(labels, pct, "%", sep = " ") pie(x, labels = lbls, main = paste0("Pie Plot of SNPs for Gene: ", genename), col = rainbow(length(x))) legend(0.8, 0.9, c("onesnp_onetissue","samesnp_differenttissue"), cex = 0.8, fill = rainbow(length(x))) dev.off() }
额外说明
- 请确保
one_tissueonly和samesnp_difft是当前循环基因对应的数据集,如果这两个对象是全局的,会导致所有饼图数据相同,建议在循环内基于gene1计算这两个数据框 - 用
nrow()替代dim()[1],代码更简洁易读 - 外层循环变量改用
idx,内层用j,避免变量名冲突
内容的提问来源于stack exchange,提问作者rheabedi1
相关产品推荐
相关产品推荐

