R语言の路书 一

写在表面: R萌新请自行恶补,本文的初衷是自己记录心路历程并且对有基础的同好能相互讨论,彼此激励。不排除写着写着,变成科普,尽力保持门槛。喜则阅,不喜勿喷。耐受催更,不定时答疑 :)。


第一日:看着飞舞的尘埃 掉下来

1.轮子 R包
2.数据类型
      2.1 向量
      2.2 数字
      2.3 字符串处理函数
3. 读入外部文件

1.轮子 R包

每个R的教材开始都是安装和IDE,没必要加,如果连R的安装都百度不到基本可以放弃R治疗了。

R是一门解释型编程语言,当然我们自己可以用它做任何事情。我的意思是可以使用最基础的工具,逻辑去实现方法、算法以及流程等。但是,\color{red}{人外有人-天外有天},有很多大神其实早就为我们实现了算法和过程,我们可以找到这些轮子然后直接使用,而不必费时自己造轮子了。这就是 R包,我的路书的最终目的就是要造R包。

如果想用一个包必须先要安装和加载。一般来说,一个包会有很多依赖的包,这些依赖的包也会相互引用,最终就形成了一个庞大繁杂的社区,对于R来说可能是 r-cran,对于我们生物计算信息来说更加喜欢使用\color{red}{bioconductor}。在这样的社区里面 我们只需要关系最终使用的是什么包,其中的相互依赖,相互做用的包的内在关系,社区以及为我们统计整合,我们直接安装 就安装了这个包所需要的整个生态。很方便是吧。

尽管各种IDE以及有很多可视化的方法管理包,不过我们还是会有很多地方不能使用IDE,而且使用命令行也更符合我们的习惯:

# 安装R包通常使用下面的语句, 你要有写入的权限
install.packages('PackageName')
# 安装之后我们就可以对其进行加载 然后使用其中的函数 方法和过程
library('PackageName')
# 升级包可以选择从头安装或者,但是你要有较高的权限
update.packages()

# 还有能让我们十分开心的bioconductor社区
# 首先我们需要安装bioconductor对包管理的包
install.packages('BiocManager')
# 安装之后我们就可以安装任何在Bioconductor维护的包了
BiocManager::install('PackageName')

# 还有一种常用的包不规范或者时间紧 或者只是内部使用而没能进入任何社区,他们把包传到一个自己的服务器或者公共区域进行维护,譬如 github
install.packages('devtools') 
devtools::install_github("bioteller/NovoEnrich")
library(NovoEnrich)

#借此机会 也推下我维护的这两个包
install.packages("devtools")
devtools::install_github("bioteller/scolocate.XL")

2.数据类型

如果你是使用R语言的常客,可能会发现在R里面其实只有一种数据类型。但是这不还是按照常规来分吧。简单类型就不详细说了 文本 数字 整数 浮点 布尔等等 千年不变,各语言通用。

我们聊聊其他的

2.1 向量

向量是个很奇怪的存在,叫她向量是因为她的翻译是如此,其实日常工作中还是习惯叫一维数组。例如:
vec1 <- c(1,4,7,9,13,17,19,23,29)
或者
vec2 <- c('reseq','tr','denovo')

数组可以被整个或部分截取(下标在R中是从1开始的)
如 :
vec1[c(5,6,7)]; vec1[5:7] # 得到的结果是一样的 都是 c(13,17,19)
此外我们也可以使用which函数进行筛选,如:
which(vec1==19)
我们甚至可以单独构建一个布尔数组,如:
vec1[c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE)]

> vec1 <- c(1,4,7,9,13,17,19,23,29) 
> vec1[c(5,6,7)]; vec1[5:7] # 得到的结果是一样的 都是 c(13,17,19)
[1] 13 17 19
[1] 13 17 19
> which(vec1==19)
[1] 7
> vec1[c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE)]
[1] 13 17 19

2.2 戏说数字

在工作中总是要生存一些随机数字,荷塘算法就需要这样的操作。
取10个 随机数字要求是小于10的正整数,如:
runif(10, min=0, max=10)
对数据还有一些四舍五入和其他的数据操作,这些内置函数都能涵盖,如:
floor(num); ceiling(num);round(num,4); abs(num)
提了随机函数 顺便提一句 抽取,放回抽取和 不放回抽取
sample(x,n,replace=F,prob=NULL)

set.seed()这个函数能够固定下你的随机方案,这样就能实现随机的可重复。

2.3 字符串处理函数

字符串处理在R语言中并不是十分强项 但是其使用的频率也很高。尽管R语言提供了很多字符串操作函数,但是我们在实际使用的时候 还是会优先使用stringi等文字处理包,以下是基础包常用的字符串函数。

字符串分割函数:strsplit( )

字符串分割是我们常用的功能,在R里面字符串处理其实是弱项,但是也是有一些基础功能是比较常用的,譬如按照分隔符分割字符串成列表的strsplit

> str1 <- "GB_PAG denovo.1"
> strsplit(str1," ")
[[1]]
[1] "GB_PAG"  "denovo.1"

如果想按照两个分隔符分割字符串的时候,那可能需要多次split,然而这个strsplit却出人意料的支持正则的写法,这就为这个函数扩展了更多用途。我先抛个砖引个更大的砖。

> strsplit(str1,"[ _]")
[[1]]
[1] "GB"       "PAG"       "denovo.1"  
> strsplit(str1,"[.]")
[[1]]
[1] "GB"       "PAG"       "denovo"       "1"
字符串连接函数:paste( ),paste0()

这个就是我不太喜欢的地方,在python中字符串加法不香吗,在excel中字符串“&”连接不快吗,为啥这里面非要用个函数呢。但是其实这个函数远比连接字符串有更多用途。

> str1 <- "GB_PAG denovo.1"
> str2 <- "Pb-assembly"
> paste(str1,str2,sep="_")
[1] "GB_PAG denovo.1_Pb-assembly"
> paste0(str1,str2)
[1] "GB_PAG denovo.1Pb-assembly"

paste字符串和数组,甚至数组和数组会怎么样的,其实 试试便知。

> product <- c("QC","assembly","annotation")
> paste(str1,product)
[1] "GB_PAG denovo.1 QC"         "GB_PAG denovo.1 assembly"   "GB_PAG denovo.1 annotation"
> paste(product,collapse = ";")
[1] "QC;assembly;annotation"
> m <- c(1,2)
> paste(m,product) # 当其中一个数组的长度不足时,其元素会被复用
[1] "1 QC"         "2 assembly"   "1 annotation"
计算字符串长度:nchar( )

计算字符串的长度,同样的如果给定一个数组,会返回每个元素的字符长度。

> nchar(str1)
[1] 15
# 顺便说一下计算数组和数据框长度的方法
> nchar(product)
[1]  2  8 10
> length(product)
[1] 3

这个函数很简单,我也不知道我为什么单独分一个项,可能是不能合并其他分类吧。内容不够矩阵来凑,顺便看下如何确定矩阵的长宽。

> m <- runif(12,10,20)
> dim(m)
NULL
> mtx1 <- matrix(m,nrow = 3,ncol = 4)
> dim(mtx1)
[1] 3 4
> nrow(mtx1); ncol(mtx1)
[1] 3
[1] 4

> m <- runif(12,10,20)
> dim(m) <-c(3,4)
> m
         [,1]     [,2]     [,3]     [,4]
[1,] 19.65415 13.89828 12.26467 10.05988
[2,] 17.07482 16.98544 14.84558 11.87712
[3,] 16.44543 15.44058 17.93007 16.81834
字符串截取函数:substr( )及substring( )

截取啊截取,没啥可说的,直接上示例。

 > substr("GB_PAG",4,6)
[1] "PAG"
> substring("GB_PAG", 4,6 )
[1] "PAG"
> substring("GB_PAG", 1:5, 1:5) # 和strsplit("GB_PAG","")得到一样结果
[1] "G" "B" "_" "P" "A"
> substring("GB_PAG", 1:3, 4:5)
[1] "GB_P" "B_PA" "_P" 
> substring("ATATCTGCCGTATGA", c(1,3,5), c(4,6,9))
[1] "ATAT"  "ATCT"  "CTGCC"
字符串替换函数:chartr( )

这个函数有点怪,替换的时候 会依照内容依次替换而不是查找整个词

> chartr("ise", "why", x)
[1] "MwXyd cAhE 123 ww"

我其实并不知道为什么这种函数会存在,我的意思不是说他没有用,而是觉得他最初可能就是为了基因序列而构建的(画外音:肤浅)。

> chartr("ACTG","TGAC","ATATCTGCCGTATGA")
[1] "TATAGACGGCATACT"
> chartr("ACTG","atcg","ATATCTGCCGTATGA")
[1] "acactcgttgcacga"
大小写转换函数:toupper( )、tolower( )及casefold( )

大小写转换的函数,也没啥可说。

> news <- "The number of coronavirus cases in the United States has topped 300,000, with more than 8,000 fatalities."
> toupper(news)
[1] "THE NUMBER OF CORONAVIRUS CASES IN THE UNITED STATES HAS TOPPED 300,000, WITH MORE THAN 8,000 FATALITIES."
> tolower(news)
[1] "the number of coronavirus cases in the united states has topped 300,000, with more than 8,000 fatalities."
> casefold(news,upper = T)
[1] "THE NUMBER OF CORONAVIRUS CASES IN THE UNITED STATES HAS TOPPED 300,000, WITH MORE THAN 8,000 FATALITIES."
> casefold(news,upper = F)
[1] "the number of coronavirus cases in the united states has topped 300,000, with more than 8,000 fatalities."

3. 读入外部文件

我们要做自己的统计分析计算过程,就要进行输入 输入的方式有好多种,其中最有效的就是 直接写进去,这样肯定是最方便也是最不靠谱的一种方式,读入文件可以方便的衔接其他软件们也方便分享等。

# read.csv和read.table
> df_lst <- read.table("PJNAME.txt",header = F, col.names = "PJ_name",stringsAsFactors = F)

虽然函数看起来不一样,但是其实用法和效果都差不多。需要注意的几点是,R 里面有一种对象叫做Factor 因子,因子是个很奇妙的存在,他的值是正整数,他的名称是字符串,这样重复的内容就只有一个数值。因子可以方便的对应level和其名称,其实就是个方便的存在,但是初学R的时候 很容易搞混,因为因子看起来太像字符串了,但是你在取值的时候 却是数字,在很多过程可能会发生意外的对应,但是这都不至于报错,所以在读入的时候 如果不是很确定要用factor的话,要用stringsAsFactors = F 强制不做因子类型。
此外现在有比较不错的就是 基于c开发的快速读入文件的包data.table::fread, 能极速读入超大文件。


往期列表
第一日:r'看着飞舞的尘埃  掉下来'
第二日:r'没人发现他存在多自由自在'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容