目的:读入序列文件(fasta格式),返回一个数据框,内容包括——存储ID、注释行(anno)、长度(len)、序列内容(content)

一、问题思考:

  1. 如何识别注释行和序列内容行

  2. 如何快速定位序列内容所在位置

二、你可能需要的知识——基本的R语言基础

  1. R语言基本数据类型

  2. 会使用帮助(help,?)及网络资源

  3. 其他的部分可能需要你针对自己看到的问题自己想办法解决或者留言

##--构建函数--##
seq_import <- function( file ){
seq <- readLines(file) # 读入序列,每个元素存入一行
seq <- seq[seq != ""] # 去除空行
is.anno <- regexpr("^>", seq, perl=T) # 正则匹配(regular expression)注释行,是注释行为1,否则为-1
seq.anno <- seq[ which(is.anno == 1) ] # 注释内容
seq.content <- seq[ which(is.anno == -1) ] # 序列内容
##--计算每条序列内容所占的行数,便于后来拼接--##
start <- which(is.anno == 1) # 注释行行号
end <- start[ 2:length(start) ]-1 # 第二条记录注释行到最后一条记录注释行行号减一,即为每条记录结束行号,这里会统计少一行——最后一行的结束未统计
end <- c(end, length(seq) ) # 末尾添加一行:所有序列结束行
distance <- end - start # 每条记录所占行号
index <- 1:length(start) # 生成一个一到记录总个数的向量
index <- rep(index, distance) # 分组标签
seqs <- tapply(seq.content, index, paste, collapse="") # 拼接每条序列内容,返回一个列表,列表每个元素为一条序列的内容
seq.content<-as.character( seqs ) # 将列表转换为向量,向量每个元素为一条序列的内容
seq.len <- nchar(seq.content) # 获得序列长度
seq.ID <- gsub("^>(\\w+\\|){3}([A-Za-z0-9.]+)\\|.*", "\\2", seq.anno, perl = T) # 获取序列的ID
result <- data.frame( seq.ID, seq.anno, seq.len, seq.content ) # 组件结果:ID,长度,注释行,序列内容
result # 最后一行作为返回值
}

三、文件内容:(复制时最后一行需要换行符,否则最后一行读取不到)

>gi|10579650|gb|AAG18645.1| hypothetical protein VNG_0001H [Halobacterium sp. NRC-1]
MTRRSRVGAGLAAIVLALAAVSAAAPIAGAQSAGSGAVSVTIGDVDVSPANPTTGTQVLITPSINNSGSA
SGSARVNEVTLRGDGLLATEDSLGRLGAGDSIEHTTHHVPLSSTFTEPGDHQLSVHVRGLNPDGSVFYVQRSVYV
TVDDRTSDVGVSARTTATNGSTDIQATITQYGTIPIKSGEHTTHLQVVSDGRIVERAPVANVSESDSANVTFDG
ASIPSGELVIRGEYTLDDEHSTHTTNTTLTYHHYHQHPQRSADVALTGVEASGGGTTYTISGDAANLGSADAASV
RVNAVGDGLSANGGYFVGKIETSEFATFDMTVQADSAVDEIPITVNYSADGQRYSDVVTVDVSGASSGSA
TSPERAPGQQQKRAPSPSNGASGGGLPLFKIGGAVAVIAIVVVVVRRWRNP
>gi|10579651|gb|AAG18646.1| amino acid ABC transporter, ATP-binding protein [Halobacterium sp. NRC-1]
MSIIELEGVVKRYETGAETVEALKGVDFSAARGEMVTVVGPSGSGKSTMLNMIGLLDSPTAGSVTLDGQD
VTGFSEDERTEERRAELGFVFQSFHLLPMLTAVENVELPSMWDTSVDRHDRAVDLLERVGLGDRLTHTPG
ELSGGQQQRVAIARSLINEPEILLADEPTGNLDQEHTTHTGGTILTEMQRLHTKHTEEENIAVVAITHDTQLEEFSDR
AVNLVDGVLHTTHH

四、调用函数,查看结果:

setwd("E:/bioinfor/bioBook/") # 设定工作目录
rm(list = ls()) # 清空变量
my_file<-"seq.txt" # 指定序列文件
source("./seq_import.R") # 载入函数
my_sequences<-seq_import(file = my_file) # 调用函数

五、结果截图:

六、问题解决

  1. 如何识别注释行和序列内容行(正则匹配)

  2. 如何快速定位序列内容所在位置(注释行之间的就是系列,可利用此特性求出序列行所占行数,然后利用tapply+paste分组连接)

七、函数注释

1. grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,
fixed = FALSE, useBytes = FALSE, invert = FALSE)

作用:从x搜索某种模式,找到返回下标,没找到返回数字0
pattern-匹配规则
x-待匹配对象
ignore.case-是否区分大小写
perl-
value-“否”返回下表,“是”返回匹配到的子串本身
fixed-“否”使用正则表达式匹配,“是”则不使用
useBytes-
invert-“是”反向匹配,即返回未匹配的向量的下表或本身,“否”正向匹配
> grep("w", c("a", "b", "ww", "w"), fixed = T)
[1] 3 4

2. grepl(pattern, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
作用:与grep相似,但是返回逻辑值
> grepl("w", c("a", "b", "ww", "w"))
[1] FALSE FALSE TRUE TRUE
3. sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
作用:在x中搜索pattern,并且以replacement替换,但是只匹配、替换一次,返回替换后的字串,没有匹配上的则不替换

> sub("(\\w)\\d",replacement = "\\1", c("a1x1", "b1x2", "c1x3") )
[1] "ax1" "bx2" "cx3" > sub("(\\d)",replacement = "@", c("a1x1", "b1x2", "ww") )
[1] "a@x1" "b@x2" "ww"

4. gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)
作用:在x中搜索pattern,并且以replacement替换,替换所有符合要求的模式
> gsub("(\\w)\\d",replacement = "\\1", c("a1x1", "b1x2", "c1x3") )
[1] "ax" "bx" "cx"
5. regexpr(pattern, text, ignore.case = FALSE, perl = FALSE,
        fixed = FALSE, useBytes = FALSE)
作用:返回匹配到的字串的起始位置,以及匹配长度,每个元素匹配一次。未匹配到返回-1
> regexpr("t", c("temp", "tmp",  "tmppt" ), useByte = T)
[1] 1 1 1 # 匹配起始位置
attr(,"match.length")
[1] 1 1 1 # 属性值,可用att(对象, 属性)查看
attr(,"useBytes")
[1] TRUE

> tt<-regexpr("t", c("temp", "tmp",  "tmppt" ), useByte = T)
> attr(tt, "match.length")
[1] 1 1 1
6. gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,
         fixed = FALSE, useBytes = FALSE)
作用:返回匹配到的字串的起始位置,以及匹配长度,匹配所有元素的所有位置.未匹配到返回-1
> gregexpr("t", c("temp", "tmp",  "tmppt" ), useByte = T)
[[1]]
[1] 1
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE [[2]]
[1] 1
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE [[3]]
[1] 1 5
attr(,"match.length")
[1] 1 1
attr(,"useBytes")
[1] TRUE
7. regexec(pattern, text, ignore.case = FALSE,
        fixed = FALSE, useBytes = FALSE)
作用:返回匹配到的字串的起始位置,以及匹配长度,每个元素匹配一次。未匹配到返回-1
> regexec("t", c("temp", "tmp",  "tmppt" ), useByte = T)
[[1]]
[1] 1
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE [[2]]
[1] 1
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE [[3]]
[1] 1
attr(,"match.length")
[1] 1
attr(,"useBytes")
[1] TRUE

7.tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

作用:对向量中的数据进行分组处理(可以把每组当成一个新的向量)

X-待处理对象,通常为向量

INDEX-与X相同长度的列表,会被强制性转换为因子变量,作为分组的一句

FUN-函数

...-函数参数

simplify-“FALSE”返回结果为列表,“TRUE”返回结果为与X相同

> x<-c("abc", "de", "f", "gh")
> index<-c(1, 1, 2, 2)
> tapply(x, index, paste, collapse="+", simplify=F)
$`1`
[1] "abc+de" $`2`
[1] "f+gh" > tapply(x, index, paste, collapse="+", simplify=T)
1 2
"abc+de" "f+gh" > paste(c("abc","de"),collapse ="+")
[1] "abc+de"

No.1 R语言在生物信息中的应用——序列读取及格式化输出的更多相关文章

  1. No.2 R语言在生物信息中的应用—模式匹配

    目的: 1. 计算自定义模序在所有蛋白质的匹配位点和次数 2. 输出超过阈值的蛋白质序列到Hit_sequences.fasta 3. Hit_sequences.fasta中序列用小写字母,匹配用大 ...

  2. R语言使用过程中出现的问题--读取EXCEL文件

    方法一: 按照R导论中的方法,使用RODBC包, library(RODBC) channel<-odbcConnectExcel("file.xlsx") da2<- ...

  3. R语言作为BI中ETL的工具

    R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...

  4. 概率图模型 基于R语言 这本书中的第一个R语言程序

    概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...

  5. WPF中任意Object的XAML代码格式化输出

    原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...

  6. [R语言]forecast.Arima中使用xreg报错

    问题: 使用forecast.Arima对带xreg的arima模型进行预测,报xreg Error pre.m4x <- forecast.Arima(m4x, h = 20, xreg = ...

  7. python中的循环和编码,运算符, 格式化输出

    1.while循环 现在让我们来看看python中的while循环  格式为 while 条件 循环体 (break) (continue) 中断循环的关键字有break和continue, brea ...

  8. R语言数据框中,用0替代NA缺失值

    1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...

  9. R语言判断向量中是否存在一个元素

    判断ori_data[,1]中是否存在元素a: a %in% ori_data[,1] 如果存在返回 true,否则返回 false    

随机推荐

  1. mac上安装lua

    一.背景 最近在操作redis的时候,有些时候是需要原子操作的,而redis中支持lua脚本,因此为了以后学习lua,此处记录一下 lua的安装. 二.mac上安装lua 其余的系统上安装lua步骤大 ...

  2. pyinstaller和wordcloud和jieba的使用案列

    一.pyinstaller库 1.简介 pyinstaller库:将脚本程序转变为可执行(.exe)格式的第三方库 注意:需要在.py文件所在目录进行以下命令,图标扩展名是.ico 2.格式: pyi ...

  3. error: ‘int64_t’ does not name a type

    我在CodeBlock中编译工程没有出现问题,但是放到ubuntu上用自己写的Makefile make的时候报错 error: 'int64_t' does not name a type # 2 ...

  4. Get_init_color_map

    #!/bin/bash./simulate_screencap.sh./analysis_screencap.py

  5. C#笔记1__命名空间 / 常量 / object / is、as、...?... :...

    命名空间:namespace Test1{ ... } 引用命名空间:using System; using 别名=命名空间 常量:const double PI=3.14; using System ...

  6. vue.js+elementUI文件上传、文件导入、文件下载

    1.文件下载 <el-button plain @click ="exportVmExcel()" size='mini' icon="el-icon-downlo ...

  7. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  8. loadrunner奇怪问题解决:TPS中有Action_Transaction 和 vuser_init_Transaction

    TPS图里多出两条曲线:Action_Transaction 和 vuser_init_Transaction 如下图: 解决方法: Runtime-Settings-Miscellaneous--A ...

  9. 论文解读(DeepWalk)《DeepWalk: Online Learning of Social Representations》

    一.基本信息 论文题目:<DeepWalk: Online Learning of Social Representations>发表时间:  KDD 2014论文作者:  Bryan P ...

  10. Django 小实例S1 简易学生选课管理系统 1 项目流程梳理与数据库设计

    Django 小实例S1 简易学生选课管理系统 第1章--项目流程梳理与数据库设计 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 项目流程梳理 ...