# R语言使用
## 1.Barpolt 条形图📊
barplot(c("男生"=10, "女生"=7),main="男女生人数",col=c("red","orange") )
#以上代码可能会由于格式的问题,中文字体不显示,因此可以通过使用一下命令进行修改
#par(family='STKaiti')
## 2.打开cvs文件同时显示前几行
> tax.tab <- read.csv("/Users/zhangjian/Desktop/R/Rbook-data/taxsamp.csv", header=TRUE, as.is=TRUE)
> print(head(tax.tab))
## 3.创建R语言格式文件
使用atom创建一个文件同时保存为str.r
sum.of.squares <- function(x){
sum(x^2)
}
atom的下载地址[https://atom.io/]
## 4打开已经创建的str.r
source("/Users/zhangjian/Desktop/str.r")
#调用已经创建的函数
> sum.of.squares(3)
[1] 9
## 5如何打印向量中的特定位置的数值
x <- c(1:3, 10:13)
print(x[4])
[1] 10
## 6生成规则序列的函数
### Seq req函数
seq(5)
#等同于1:5
seq(2,5)
#等同于2:5
seq(11, 15, by=2)
#产生11,13,15
seq(0, 2*pi, length.out=100)
#产生从0到的等间隔序列, 序列长度指定为100
Pi 就是圆周率的意思
pi =3.1415926535898
### Req函数
#rep()函数用来产生重复数值。 为了产生一个初值为零的长度为n的向量, 用x <- rep(0, n)
#把第一个自变量重复两次
> rep(c(1,3), 2)
[1] 1 3 1 3
> rep(c(1,3), c(2,4))
[1] 1 1 3 3 3 3
#则需要利用R的一般向量化规则, 把第一自变量的第一个元素1按照第二自变量中第一个元素2的次数重复, 把第一自变量中第二个元素3按照第二自变量中第二个元素4的次数重复, 结果相当于c(1,1,3,3,3,3)。
> rep(c(1,3), each=2)
[1] 1 1 3 3
#如果希望重复完一个元素后再重复另一元素,用each=选项, 比如rep(c(1,3), each=2)结果相当于c(1,1,3,3)。
## 7 identical函数
Identical函数用来判断两个对象是否是一样的
> identical(c(1,2,3), c(1,2,NA))
[1] FALSE
> identical(c(1L,2L,3L), c(1,2,3))
[1] FALSE
第二个为什么会不一样,是因为c(1L,2L,3L) 是整数型,而c(1,2,3)是实数型
如何解决以上问题
函数all.equal()可以在比较数值型时不区分整数型与实数型
> all.equal(c(1,2,3), c(1L,2L,3L))
[1] TRUE
## 8字符串中缺失值的表示方法
> x <- c("huh", "nniun", NA)
> x
[1] "huh" "nniun" NA
**注意空字符串并不能自动认为是缺失值, 字符型的缺失值仍用NA表示。**
## 9 paste()函数
字符串的连接方法
> x <- c(11:29)
> y <- c(1:23)
> paste(x,y)
[1] "11 1" "12 2" "13 3" "14 4" "15 5" "16 6" "17 7" "18 8" "19 9"
[10] "20 10" "21 11" "22 12" "23 13" "24 14" "25 15" "26 16" "27 17" "28 18"
[19] "29 19" "11 20" "12 21" "13 22" "14 23"
## 10 as.numeric()函数
将其他类型的数值转换成数值类型
> x <- c("7896778565", "090909")
> x
[1] "7896778565" "090909"
> as.numeric(x)
[1] 7896778565 90909
说实话能够正常转化为数值类型是数据也就是数值的字符串而已了
## 11 as.character()函数
把数值型转换为字符型
> as.character((1:5)*5)
[1] "5" "10" "15" "20" "25"
## 12 sprintf()函数
为了用指定的格式数值型转换成字符型, 可以使用sprintf()函数, 其用法与C语言的sprintf()函数相似, 只不过是向量化的
> sprintf('file%03d.txt', c(1, 99, 100))
[1] "file001.txt" "file099.txt" "file100.txt"
这里可以用来批量的给文件命名 ,或还能够批量重命名
## 13 which()函数
which()函数可以返回满足条件的下角标
> x <- c(3, 4, 3, 5, 7, 5, 9)
> which(x > 5)
[1] 5 7
#👆的命令是在向量x中寻找大于5的元素,同时返回其下角标
## 14 如何给向量中的元素命名
ages <- c("李明"=30, "张聪"=25, "刘颖"=28)
#方法一
ages <- c(30, 25, 28)
names(ages) <- c("李明", "张聪", "刘颖")
#方法二
ages <- setNames(c(30, 25, 28), c("李明", "张聪", "刘颖"))
方法三
当给向量中的元素通过以上的方式命名后,可以通过命名后的查找向量中的元素
方法一
> ages[c("李明", "刘颖")]
李明 刘颖
30 28
方法二
> print(ages["李明"])
李明
30
**以上操作实际上建立了字符串到数值的映射表**
#建立映射表
> sex.color <- c("男"="blue", "女"="red")
> sex.color
男 女
"blue" "red"
#新建一个包含信息的向量
> sex <- c("男", "男", "女", "女", "男", "女", "女", "女", "女", "男")
#通过使用映射表来查找向量对应的元素
> cols <- sex.color[sex]; print(cols)
男 男 女 女 男 女 女 女 女 男
"blue" "blue" "red" "red" "blue" "red" "red" "red" "red" "blue"
> unname(cols)
[1] "blue" "blue" "red" "red" "blue" "red" "red" "red" "red" "blue"
## 15 unique()函数
可以将在向量中的重复元素给去重
> unique(c(1, 5, 2, 5))
[1] 1 5 2
##16如何判断一个元素是否在一个向量中
a %in% x用来判断元素是否是在一个集合中
> c(5,6) %in% c(1,5,2)
[1] TRUE FALSE
#R中的%in%是会作一个逻辑判断
match(x, table) 函数和a %in% x 具有相同的作用
> match(5, c(1,5,2))
[1] 2
> match(5, c(1,7,2))
[1] NA
#match函数会寻找出来匹配的元素的下角标,如果不匹配就会报NA
##17交,并,差集,相等
intersect(x,y)函数用来求两个向量之间的交集
> intersect(c(5, 7), c(1, 5, 2, 5))
[1] 5
union(x,y)函数求并集,结果中不含重复元素
> union(c(5, 7), c(1, 5, 2, 5))
[1] 5 7 1 2
setdiff(x,y)求差集,即x的元素中不属于y的元素组成的集合, 结果中不含重复元素
> setdiff(c(5, 7), c(1, 5, 2, 5))
[1] 7
#这个是c(5, 7)中的元素那个是在c(1, 5, 2, 5)中没有的
> setdiff(c(1, 5, 2, 5), c(5, 7))
[1] 1 2
#这个是c(1, 5, 2, 5)中的元素那个是在c(5, 7)中没有的
setequal(x,y)判断两个集合是否相等, 不受次序与重复元素的影响
> setequal(c(1,5,2), c(2,5,1))
[1] TRUE
> setequal(c(1,5,2), c(2,5,1,5))
[1] TRUE
#👆这个是对两个向量进行的整体判断,不管是向量中元素的顺序和重复的影响
#👇这个是对两组向量中的元素按照固定的顺序进行一一对应,而得出逻辑判断操作
> c(2,5,1) == c(1,5,2)
[1] FALSE TRUE FALSE
# 问题与解决方法
## 问题1
在Rstudio中的polt面板不显示中文
解决方法:需要指定字体
par(family='STKaiti') # 改字体, 否则不显示中文
## 问题2
在使用Rstudio打开文件的时候,报错(多字节字符串有错)
> tax.tab <- read.csv("/Users/zhangjian/Desktop/R/Rbook-data/taxsamp.csv", header=TRUE, as.is=TRUE)
Error in make.names(col.names, unique = TRUE) :
'<b9><ab>˾<b1><e0><ba><c5>'多字节字符串有错
这里可能就是因为编码的问题导致的
Mac系统上一般的编码方式为utf-8 而win中文系统的一般编码方式为GBK
所以在这里需要在Excel保存文件的时候选择UTF-8编码模式就可以解决此问题
## 问题3
源文件编码问题
解决不同平台上面的编码问题导致的源代码无法复用的问题
在source()函数中可以添加encoding=选项
source("/Users/zhangjian/Desktop/str.r", encoding = "UTF-8")
UTF-8中的字母需要设置大写
## 问题4
log10(99.99999999999999999)正常情况下所得的结果肯定不到2,为什么在R 中进行比较的时候 ,会显示 log10(99.99999999999999999)= 2
> sele <- (log10(99.99999999999999999) < 2); print(sele)
[1] FALSE
> sele <- (log10(15) < 2); print(sele)
[1] TRUE
> sele <- (log10(99) < 2); print(sele)
[1] TRUE
> log10(99.9999999999999999999)
[1] 2
这里可能和计算机计算浮点数的原理有关
> log10(99.999)
[1] 1.999996
> log10(99.9999)
[1] 2
## 问题5
以下内容为什么会报错呢
> x <- 1:100000000
> strsplit(x, ',', fixed=TRUE)[[1]]
Error in strsplit(x, ",", fixed = TRUE) : 非字符参数
是因为给变量X 所附的值为一个数值类型不是字符串类型,因此就无法使用 ,' 来切分字符串
# 小技巧
## 1 Atom 文本工具下载地址
[https://atom.io/]
## 2 如何快速切换到上一步命令
键盘⌨️上面的上下键
##3 source()调用源程序文件或者用read.csv()读入数据文件
需要输入文件所在的绝对目录
for example
/Users/zhangjian/Desktop/rstudio-ide.pdf
#如何快速得到文件的绝对目录,可以将文件直接拖到终端里面
## 4 绝对目录与相对目录
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径
(base) zhangjiandeMacBook-Pro:~ zhangjian$ /Users/zhangjian/Desktop/sly_1_clean_collapsed.fasta
#👆的就是sly_1_clean_collapsed.fasta 文件的绝对目录,其是从盘符开始的
相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系
(base) zhangjiandeMacBook-Pro:~ zhangjian$ cd ~/desktop
#切换到dektop目录
(base) zhangjiandeMacBook-Pro:desktop zhangjian$ ls
#显示desktop目录下的所有文件,这里也可以使用ls -l显示文件的具体参数
PhaseTank_Tutorial sly_1_clean_collapsed.fasta
R 文献库
example 未标题-1.pdf
mi_rna_app 未标题-2
mirdeep2-master 未标题-2.pdf
sly-mirna
(base) zhangjiandeMacBook-Pro:desktop zhangjian$ head ~/desktop/sly_1_clean_collapsed.fasta
>sl1_0_x62057
AGTTACTAATTCATGATCTGGC
>sl1_62057_x45550
TCGGACCAGGCTTCATTCCCC
>sl1_107607_x43623
CTAACAGACCGGTAGACTTGAAC
>sl1_151230_x23996
ACAAACGACTCTCGGCAA
>sl1_175226_x16618
CCCCAAGATGAGTGCTCTCCT
# 知识点
---- 小知识点-1
NA 代表的是"缺失",NULL 代表的是"不存在"。
NA 缺失就想占位符,代表这里没有一个值,但位置存在。
NULL 代表的就是数据不存在。
---- 小知识点-2
UTF-8(8-bit Unicode Transformation Format)(Mac系统内置)
汉字内码扩展规范,称GBK,全名为《汉字内码扩展规范(GBK)》1.0版 (win系统内置)
---- 小知识点-3
变量用来保存输入的值或计算的结果。 变量可以存放各种不同类型的值, 如单个数值、多个数值(称为向量)、单个字符串、多个字符串(称为字符型向量),等等。 单个数值称为标量
---- 小知识点-4
组合数的概念
---- 小知识点-5
浮点数
单精度浮点数
单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算。占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位。其数值范围为-3.4E38~3.4E38,单精度浮点数最多有7位十进制有效数字,单精度浮点数的指数用“E”或“e”表示。
如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
双精度浮点数
双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:-1.79E+308 ~ +1.79E+308~
---- 小知识点-6
向量与标量x1 + x2
---- 小知识点-7
矩阵置换
> M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
> print(M)
[,1] [,2] [,3]
[1,] 2 6 5
[2,] 1 10 4
#将矩阵M进行置换
> t(M)
[,1] [,2]
[1,] 2 1
[2,] 6 10
[3,] 5 4
#将置换后的矩阵赋值于v
> v <- t(M)
> print(v)
[,1] [,2]
[1,] 2 1
[2,] 6 10
[3,] 5 4
#矩阵相乘
> y = M %*% v
> print(y)
[,1] [,2]
[1,] 65 82
[2,] 82 117
**矩阵相乘的原理**
矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑地集中到了一起,所以有时候可以简便地表示一些复杂的模型,如电力系统网络模型。
(img)
(img)
(img)
(img)
---- 小知识点-8
e数学常数
e,作为数学常数,是自然对数函数的底数。有时被称为欧拉数(Euler's number),以瑞士数学家欧拉命名;还有个较少见的名字纳皮尔常数,用来纪念苏格兰数学家约翰·纳皮尔引进对数。它是一个无限不循环小数,数值约是(小数点后20位,OEIS A001113):e = 2.71828182845904523536
> exp(1)
[1] 2.718282
---- 小知识点-9
e数学常数
e,作为数学常数,是自然对数函数的底数。有时被称为欧拉数(Euler's number),以瑞士数学家欧拉命名;还有个较少见的名字纳皮尔常数,用来纪念苏格兰数学家约翰·纳皮尔引进对数。它是一个无限不循环小数,数值约是(小数点后20位,OEIS A001113):e = 2.71828182845904523536
> exp(1)
[1] 2.718282
---- 小知识点-10
布尔数据类型
布尔(英语:Boolean)是计算机科学中的逻辑数据类型,以发明布尔代数的数学家乔治·布尔为名。它是只有两种值的原始类型,通常是真和假。布尔数据类型主要与条件语句相关系,条件语句通过根据开发人员指定的条件式,更改程序控制流来允许评估语句的运算值为真或假(即条件成立或不成立)。这是一种更广泛的逻辑数据类型的特殊情况(参见概率逻辑)-逻辑并不总是只属于布尔类型的。
在一些语言中,布尔数据类型被定义为可代表多于两个真值。例如,ISO SQL:1999标准定义了一个SQL布尔型可以储存三个可能的值:真、假、未知(SQL null被当作未知真值来处理,但仅仅在布尔型中使用)。在此情况下,未知先于真及假,因为布尔型一开始是未有实际值,其值是unknown(也有机会是随机值)而非真。
---- 小知识点-11
缺失值,结果可能为缺失值
> c(1, NA, 3) > 2
[1] FALSE NA TRUE
---- 小知识点-12
[:space:] 匹配空白字符,包括空格,tab
gsub('[[:space:]]+', ' ', 'a cat in a box', perl=TRUE)
#[[:space:]]+ 这个正则表达式是表示是是多个空格或者tab键的意思
#同时使用一个空格替换多个空格
---- 小知识点-13
R语言里面的大括号、中括号、小括号的作用
()定义函数的参数
> sprintf('file%03d.txt', c(1, 99, 100))
[1] "file001.txt" "file099.txt" "file100.txt"
#在()里面的'file%03d.txt', c(1, 99, 100)是函数sprintf所定义的参数
()在运算中作为优先级
> 3*(4+5-2)-34
[1] -13
> 3*4+5-2-34
[1] -19
#以上代码表明了因为有()的存在,运算的结果发生了变化
[] 用做对象的元素索引
> x = seq(99,699,by=3)
> x[5]
[1] 111
> print(x)
[1] 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153
[20] 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210
[39] 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267
[58] 270 273 276 279 282 285 288 291 294 297 300 303 306 309 312 315 318 321 324
[77] 327 330 333 336 339 342 345 348 351 354 357 360 363 366 369 372 375 378 381
[96] 384 387 390 393 396 399 402 405 408 411 414 417 420 423 426 429 432 435 438
[115] 441 444 447 450 453 456 459 462 465 468 471 474 477 480 483 486 489 492 495
[134] 498 501 504 507 510 513 516 519 522 525 528 531 534 537 540 543 546 549 552
[153] 555 558 561 564 567 570 573 576 579 582 585 588 591 594 597 600 603 606 609
[172] 612 615 618 621 624 627 630 633 636 639 642 645 648 651 654 657 660 663 666
[191] 669 672 675 678 681 684 687 690 693 696 699
#使用seq函数生成了一个从99到699,步长为3的向量,然后可以使用x[5],对这个向量中的数值进行索引
{} 作为代码段落的起止