目的:读入序列文件(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. 基于docker-compose搭建sonarqube代码质量检测平台

    一.需求 在我们开发的过程中,难免有时候代码写的不规范,或存在一些静态的bug问题,这个时候一个良好的代码检查工具就很有必要,而sonarqube正好可以满足整个要求. 二. docker-compo ...

  2. poj 2960 S-Nim (SG)

    题意: K个数,s1...sk. m个状态,对于某一个状态,有L堆石子,每人每次取的石子个数只能是s1...sk的一个,且只能在一堆中取. 输出m个状态是先手胜还是先手败,先手胜输出W,否则输出L. ...

  3. netfilter/iptables 学习

    netfilter概述 netfilter 组件位于内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集. iptables 组件是 ...

  4. ELK集群之metricbeat(9)

    Metricbeat包的安装及简单使用 Metricbeat包的安装及简单使用 系统数据采集 Python -> ES -> Grafana metricbeat的安装 metricbea ...

  5. Android Thermal HAL 降龙十八掌

    基本概念 参阅下面两篇文章,就可以大概了解一些概念的内容了 https://source.android.com/devices/architecture/hidl/thermal-mitigatio ...

  6. 获取鼠标在 canvas 中的位置

    一般情况 一般情况下,如果需要在 canvas 中获取鼠标指针坐标,可以通过监听鼠标的 mousemove(如果只需单击时的坐标,可以用 click)事件. 当事件被触发时,我们可以获取鼠标相对于 v ...

  7. XMLHttpRequest—>Promise

    XMLHttpRequest.open() 初始化 HTTP 请求参数 语法open(method, url, async, username, password) method 参数是用于请求的 H ...

  8. Python 爬取 猫眼

    1. import requests import re import pymongo MONGO_URL='localhost'#建立连接 MONGO_DB='Maoyan'#创建数据库 clien ...

  9. 菜鸡的Java笔记 第八 - java 面向对象

    面向对象的特点以及开发过程.    java中最大的特点是其支持面向对象编程设计思想.在面向对象之前广泛流传的是面向过程的编程思想,例如:C语言的开发就属于面向过程    如果要想更简单的去理解面向过 ...

  10. Python布尔值

    在学到Python数据类型时,发现与大多数语言没什么区别 布尔值可以用 and or not 来运算 and运算是与运算,所有条件都符合才为true >>> True and Tru ...