No.1 R语言在生物信息中的应用——序列读取及格式化输出
目的:读入序列文件(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语言在生物信息中的应用——序列读取及格式化输出的更多相关文章
- No.2 R语言在生物信息中的应用—模式匹配
目的: 1. 计算自定义模序在所有蛋白质的匹配位点和次数 2. 输出超过阈值的蛋白质序列到Hit_sequences.fasta 3. Hit_sequences.fasta中序列用小写字母,匹配用大 ...
- R语言使用过程中出现的问题--读取EXCEL文件
方法一: 按照R导论中的方法,使用RODBC包, library(RODBC) channel<-odbcConnectExcel("file.xlsx") da2<- ...
- R语言作为BI中ETL的工具
R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...
- 概率图模型 基于R语言 这本书中的第一个R语言程序
概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...
- WPF中任意Object的XAML代码格式化输出
原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...
- [R语言]forecast.Arima中使用xreg报错
问题: 使用forecast.Arima对带xreg的arima模型进行预测,报xreg Error pre.m4x <- forecast.Arima(m4x, h = 20, xreg = ...
- python中的循环和编码,运算符, 格式化输出
1.while循环 现在让我们来看看python中的while循环 格式为 while 条件 循环体 (break) (continue) 中断循环的关键字有break和continue, brea ...
- R语言数据框中,用0替代NA缺失值
1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...
- R语言判断向量中是否存在一个元素
判断ori_data[,1]中是否存在元素a: a %in% ori_data[,1] 如果存在返回 true,否则返回 false
随机推荐
- 2019OO第三单元作业总结
OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...
- OO第三次博客作业--第三单元总结
一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...
- 将manjaro作为主力开发系统,我遇到了哪些坑。
首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...
- 简明教程 | Docker篇 · 其二:Dockerfile的编写
Dockerfile是什么 一个包含用于组合 image 的命令的文本文件,docker 通过 dockerfile 和构建环境的上下文来构建 image . 编写Dockerfile FROM 首先 ...
- 身份证归属地查询免费api接口
描写叙述 :依据身份证编号 查询归属地信息. 调用地址: http://api.k780.com:88/? app=idcard.get&idcard=510103195309280011&a ...
- hdu 3199 Hamming Problem(构造?枚举?)
题意: For each three prime numbers p1, p2 and p3, let's define Hamming sequence Hi(p1, p2, p3), i=1, . ...
- 第01课 OpenGL窗口(4)
下面的代码处理所有的窗口消息.当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息. LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄 UINT uMsg ...
- 学会python永不加班系列之操作excel
python作为一种解释性语言,简单高效的模式逐渐火爆.同时存在多种扩展性. 永不加班系列 python正确操作excel 实验环境: 系统:win10 语言:python3.8 承载软件:pycha ...
- js this指向汇总
this指向 普通函数 window 定时器函数 window 事件函数 事件源 箭头函数 父function中的this,没有就是window 对象函数 对象本身 构造函数 实例化 ...
- html5的Message信息提示框
1.定义dialog <dialog id="showDialog"> <div>您没有权限访问本页面!</div> </dialog&g ...