使用Rstudio与Biostrings将含DNA序列的CSV转为FASTA格式问题求助
报错原因
- 变量名不匹配:你读取CSV时将数据框赋值给了
sv变量,但后续代码全部调用不存在的csv变量,导致csv$chr返回空值,触发「替换长度为0」的报错。 - 逻辑缺陷:你描述的CSV只有染色体名称、起始位点、终止位点、链方向4列,没有预先提取的序列列,现有代码直接调用
csv$seq也会触发报错。 - 手动拼接FASTA的方法不规范:你定义的
fa长度是4倍行数,实际FASTA每行序列仅对应1条标题行,2倍行数即可,且手动拼接容易出现序列换行、特殊字符等格式错误,更推荐用Biostrings内置函数处理。
可用代码
场景1:CSV实际包含已提取好的序列列
如果你漏报了CSV中的序列列,可直接用以下代码:
library(Biostrings) # 读取CSV,变量名保持一致 csv <- read.csv("foo.csv", stringsAsFactors = FALSE) # 构造FASTA标题,可按需调整格式,这里包含完整坐标和链信息 names(csv$seq) <- sprintf("%s:%d-%d:%s", csv[,1], csv[,2], csv[,3], ifelse(csv[,4] == "", "+", csv[,4])) # 生成DNA序列集并导出 dna_set <- DNAStringSet(csv$seq) writeXStringSet(dna_set, filepath = "foo.fasta")
场景2:CSV仅有4列坐标信息,需从参考基因组提取序列
这是更符合你描述的场景,需先安装对应物种的参考基因组包(比如人类hg38对应BSgenome.Hsapiens.UCSC.hg38,拟南芥TAIR10对应BSgenome.Athaliana.TAIR.TAIR10,可直接在Bioconductor检索对应物种的包),示例代码如下:
library(Biostrings) library(BSgenome) # 替换为你实际使用的参考基因组包,这里以人类hg38为例 library(BSgenome.Hsapiens.UCSC.hg38) # 读取坐标CSV csv <- read.csv("foo.csv", stringsAsFactors = FALSE) # 生成坐标对象 gr <- GRanges( seqnames = csv[,1], ranges = IRanges(start = csv[,2], end = csv[,3]), strand = ifelse(csv[,4] == "", "+", csv[,4]) ) # 提取对应序列 dna_set <- getSeq(BSgenome.Hsapiens.UCSC.hg38, gr) # 给序列命名,按需调整格式即可 names(dna_set) <- sprintf("%s:%d-%d:%s", seqnames(gr), start(gr), end(gr), strand(gr)) # 导出FASTA文件 writeXStringSet(dna_set, filepath = "foo.fasta")
注意事项
- 需保证CSV里的染色体名称格式和参考基因组一致,比如参考基因组用
chr1格式的话,你的CSV里不要写1,否则会提取失败 - 若不需要链信息,直接删除命名里的链相关字段即可
内容的提问来源于stack exchange,提问作者HELEN BARBA
相关产品推荐
相关产品推荐

