03-02
PPT 01 向量
3-2-1向量精讲
1. 逻辑型数据
1.比较运算的结果是逻辑值
,<,<=,>=,==(是否等于),!=(是否不相等)
2.逻辑运算 多个逻辑条件的连接
与& 有一个结果是F,最终为F
或 | 有一个结果是T,最终为T
非 ! !4>5 T
2. 数据类型的判断与转换
- is 族函数,判断,返回值为T或F
is.numeric() 是否数值型数据
is.logical() 是否逻辑型数据
is.character() 是否字符型数据
2.as 族函数实现数据类型之间的转换
as.numeric() 将其他数据类型转换为数值型
as.logical() 将其他数据类型转换为逻辑型
as.character() 将其他数据类型转换为字符型
> as.numeric(3)
[1] 3
> as.logical(3>5)
[1] FALSE
> as.character("a")
[1] "a"
> as.logical("jimmy")
[1] NA
3.多个数据如何组织?
1.数据结构:
向量:数据框中单独的一列,每一列属于同一种数据类型,可以有重复值
数据框:约等于“表格”,是R语言内部存在的一种结构,不是真实存在的
矩阵
列表
4.切换Rproject
- 当没有打开Rstudio时:找到下载好的文件夹,双击立方体浅蓝色图标(.Rproj),直接打开;
- 已经打开了Rstudio:在切换Rproject 之前,检查当前打开的是否需要清空或保存(脚本、变量、图片)File--open project--找到对应文件夹--选中需要的Rproject,点击打开。
·过程中有任何弹窗都选取消 No/ don't save
·如果Rstudio运行特别慢,可删除.Rdata 这个文件
3.脚本的正确打开方式:从右下角文件面板单击打开xx.R
4.脚本打开是乱码的解决方案:file--open with encoding--UTF-8--OK
2.1向量的生成
1.用 c( ) 逐一放到一起
c(2,5,6,2,9) #数值型向量
c("a","f","md","b") #字符串数据形成的向量
·规则:只允许同一种数据类型,且允许重复值存在
2.连续的数字用冒号“:”
> 1:5
[1] 1 2 3 4 5
3.有重复的用rep(),有规律的序列用seq(),随机数用rnorm
> rep("gene",times=3) #基因这个字符串重复三次
[1] "gene" "gene" "gene"
> seq(from=3,to=21,by=3) #sequence 3,6,9,--21
[1] 3 6 9 12 15 18 21
> rnorm(n=3) #随机数(多种随机数重的一种)
[1] -0.8136543 -0.9632929 1.2423969
4.通过组合,产生更为复杂的向量。
paste0(rep("gene",times=3),1:3)
image.png
练习2-2: 向量生成
1.将两种不同类型的数据用c()组合在一起,看输出结果
> c(3,"a")
[1] "3" "a"
--数值型-逻辑型-字符型
image.png
2.生成1到30之间所有4的倍数,答案是
4,8,12,16,20,24,28
> seq(from=4,to=28,by=4)
[1] 4 8 12 16 20 24 28
3.生成sample4,sample8,sample12…sample28
> paste0(rep("sample",times=7),seq(from=4,to=28,by=4))
[1] "sample4" "sample8" "sample12" "sample16" "sample20" "sample24" "sample28"
3-2-2 向量取子集
2.2对单个向量进行的操作
(1)赋值给一个变量名
x = c(1,3,5,1) #随意的写法 等号
x <- c(1,3,5,1) #规范的赋值符号 Alt/command+减号
赋值符号不能替代等号,等号可以替代赋值符号。
x为变量名,通常不用C,因为C是个已知的函数
向量由元素组成
赋值与输出一起进行
(x <- c(1,3,5,1)) 或x <- c(1,3,5,1);x
> x <- c(1,3,5,1);x
[1] 1 3 5 1
> (x <- c(1,3,5,1))
[1] 1 3 5 1
(2)简单数学计算
> x+1
[1] 2 4 6 2
> log(x)
[1] 0.000000 1.098612 1.609438 0.000000
> sqrt(x)
[1] 1.000000 1.732051 2.236068 1.000000
(3)根据某条件进行判断,生成逻辑型向量
> x>3
[1] FALSE FALSE TRUE FALSE
> x==3
[1] FALSE TRUE FALSE FALSE
(4)初级统计
> max(x) #最大值
[1] 5
> min(x) #最小值
[1] 1
> mean(x) #均值
[1] 2.5
> median(x) #中位数
[1] 2
> var(x) #方差
[1] 3.666667
> sd(x) #标准差
[1] 1.914854
> sum(x) #总和
[1] 10
> length(x) #长度 向量的长度等于向量里面元素的个数
[1] 4
> unique(x) #去重复 只保留每个数字第一次出现的结果,第二次以后被去掉
[1] 1 3 5
> duplicated(x) #判断对应元素是否重复 返回结果为逻辑值的函数
[1] FALSE FALSE FALSE TRUE
> !duplicated(x)
[1] TRUE TRUE TRUE FALSE
> table(x) #重复值统计 变量有哪些个取值,分别重复了几次
x
1 3 5
2 1 1
> sort(x) # 排序(默认从小到大)
[1] 1 1 3 5
> sort(x,decreasing = T) # 从大到小进行排列
[1] 5 3 1 1
2.3对两个向量进行的操作
x = c(1,3,5,1)
y = c(3,2,5,6)
(1)逻辑比较,生成等长的逻辑向量
> x == y #按位置对应
[1] FALSE FALSE TRUE FALSE
> x %in% y #x中的元素在y中吗(以X为中心)
[1] FALSE TRUE TRUE FALSE
Screen Shot 2021-03-09 at 8.18.43 PM.png
(2)数学计算
> x + y
[1] 4 5 10 7
(3)“连接“
> paste(x,y,sep=":")
[1] "1:3" "3:2" "5:5" "1:6"
(4)交集、并集、差集
> intersect(x,y)#交集
[1] 3 5
> union(x,y)#并集
[1] 1 3 5 2 6
> setdiff(x,y)#谁在前面谁是核心
[1] 1
> setdiff(y,x)
[1] 2 6
当两个向量长度不一致
> x = c(1,3,5,6,2)
> y = c(3,2,5)
> x == y # 啊!warning!元素个数不同
[1] FALSE FALSE TRUE FALSE TRUE
Warning message:
In x == y : longer object length is not a multiple of shorter object length#可以直接忽略
利用循环补齐简化代码
> paste0(rep("gene",3),1:3)
[1] "gene1" "gene2" "gene3"
> paste0("gene",1:3)
[1] "gene1" "gene2" "gene3"
2.4.向量筛选(取子集)
[ ]可以将TRUE对应的值挑选出来,舍去FAUSE对应的值
根据逻辑值取子集:中括号中是与X等长的逻辑值向量
> x <- 8:12
> x[x==10]
[1] 10
> x[x<12]
[1] 8 9 10 11
> x[x %in% c(9,13)]
[1] 9
image.png
根据位置取子集:中括号中是由X的下标组成的向量
> x[4]
[1] 11
> x[2:4] #中括号中内容为向量
[1] 9 10 11
> x[c(1,5)]
[1] 8 12
> x[-4]#去掉第4个,负号代表-反选
[1] 8 9 10 12
> x[-(2:4)]#反选1和5即去掉234,注意加( )
[1] 8 12
image.png
2.5.修改向量中的某个/某些元素:取子集+赋值
> x
[1] 8 9 10 11 12
> #改一个元素
> x[4] <- 40
> x
[1] 8 9 10 40 12
> #改多个元素
> x[c(1,5)] <- c(80,20)
R语言中所有的修改都需要赋值,没有赋值就是没有发生过
2.6 简单向量作图
> k1 = rnorm(12);k1
[1] 1.5583335 -0.7994595 -2.2489812 0.2934504 -0.7207822 -0.8936053 -0.1428870
[8] 0.3675650 0.5910372 1.3081505 -0.3873457 -1.4224317
> plot(k1)
image.png
K1为纵坐标,横坐标是默认生成的
引入K2时
> k2 = rep(c("a","b","c","d"),each = 3);k2
[1] "a" "a" "a" "b" "b" "b" "c" "c" "c" "d" "d" "d"
> boxplot(k1~k2) #boxplot需要1个分组向量+1个数值型向量
image.png
K1为纵坐标,横坐标
练习2-4
#练习2-4
> # 1.将基因名"ACTR3B","ANLN","BAG1","BCL2","BIRC5","RAB","ABCT","ANLN","BAD","BCF","BARC7","BALV"组成一个向量,赋值给x
> x=c("ACTR3B","ANLN","BAG1","BCL2","BIRC5","RAB","ABCT","ANLN","BAD","BCF","BARC7","BALV")
> # 2.用函数计算向量长度
> length(x)
[1] 12
> # 3.用向量取子集的方法,选出第1,3,5,7,9,11个基因名。
> x[c(1,3,5,7,9,11)]
[1] "ACTR3B" "BAG1" "BIRC5" "ABCT" "BAD" "BARC7"
> # 4.用向量取子集的方法,选出除倒数第2个以外所有的基因名。
> x[-(length(x)-1)]
[1] "ACTR3B" "ANLN" "BAG1" "BCL2" "BIRC5" "RAB" "ABCT" "ANLN" "BAD"
[10] "BCF" "BALV"
> # 5.用向量取子集的方法,选出出在c("ANLN", "BCL2","TP53")中有的基因名。
> # 提示:%in%
> y=c("ANLN", "BCL2","TP53")
> y[y%in%x]#错
[1] "ANLN" "BCL2"
> x[x%in%y]#对
[1] "ANLN" "BCL2" "ANLN"
> # 6.修改第6个基因名为"a"并查看是否成功
> x[6] <- "a"
> # 7.生成10个随机数: rnorm(n=10,mean=0,sd=18),用向量取子集的方法,筛出其中小于-2的值
> b=rnorm(10,0,18)
> b[b< -2]
[1] -18.284365 -14.128090 -12.808250 -23.562116 -2.343119 -23.283583 -14.128393
> # 6.修改第6个基因名为"a"并查看是否成功
> x[6] <- "a"
> #7.生成10个随机数: rnorm(n=10,mean=0,sd=18),用向量取子集的方法,取出其中小于-2的值
> z = rnorm(n=10,mean=0,sd=18)
> z[z< -2]
[1] -14.01877 -11.14345 -28.35111 -11.65444 -11.99324
paste与paste0区别
> paste("gene",1:3)
[1] "gene 1" "gene 2" "gene 3"
> paste0("gene",1:3)
[1] "gene1" "gene2" "gene3"
> paste("gene",1:3,sep="jimmy")
[1] "genejimmy1" "genejimmy2" "genejimmy3"
> paste("gene",1:3,sep="")#与paste0("gene",1:3)结果一致,即分隔符中没有任何东西
[1] "gene1" "gene2" "gene3"
paste0后无SEP
2.7如何调整元素顺序
向量匹配排序-match
> x<-c("A","B","C","D","E");x
[1] "A" "B" "C" "D" "E"
> x[c(2,4,5,1,3)]
[1] "B" "D" "E" "A" "C"
> y<-c("B","D","E","A","C");y
[1] "B" "D" "E" "A" "C"
> #根据Y生成ABCDE,即把Y变得和X一样
> y[c(4,1,5,2,3)]
[1] "A" "B" "C" "D" "E"
> #向量匹配排序-match
> x<-c("A","B","C","D","E")
> y<-c("B","D","E","A","C");
> match(x,y)#取子集,使Y变得和X一样
[1] 4 1 5 2 3#Y的下标(逗号后面向量的)
image.png
image.png
向量进阶小问题
1.如何将两个向量合到一起,组成一个长向量?
> x=c(1,3,5)
> y=c(2,3,4)
> test=c(x,y)
> test
[1] 1 3 5 2 3 4
2.如何在向量首/尾增加一个元素?
> x=c(3,x)
> x
[1] 3 1 3 5
> x=c(x,4);x
[1] 3 1 3 5 4
3.如何在向量第n位增加一个元素?
> n=3
> x=c(1,3,5,8,6)
> y=c(x[1:n-1],7,x[n:length(x)]);y
[1] 1 3 7 5 8 6
#写成函数
> join<-function(x,n,y){c(x[1:n-1],7,x[n:length(x)])}
> x=c(1,3,5,8,6)
> join(x,3,7)
[1] 1 3 7 5 8 6
4.如果向量x和y内容一致但顺序不一致,如何按照x的顺序重排y
> x=letters[1:5]
> y=letters[c(3,1,2,5,4)]
> match(x,y)
[1] 2 3 1 5 4
> y[match(x,y)]
[1] "a" "b" "c" "d" "e"
53:02s开始
PPT 02 数据结构
> c(1,4,5,23,5,7,6)
[1] 1 4 5 23 5 7 6
> sample(1:100,7)# 代表1到100随机取7个数,前是取样的范围,后是取样个数,取样是不放回的,不会存在任何重复
[1] 61 19 41 72 48 44 84
矩阵
> x= sample(1:100,28)
> x# 是一个向量
[1] 13 69 87 9 78 89 68 72 32 65 77 38 97 49 16 41 82 71 83 14 10 18 42 56 50 40 12
[28] 93
> matrix(x,nrow = 7)#是一个矩阵,有两个维度 row 表示行
[,1] [,2] [,3] [,4]
[1,] 13 72 16 18
[2,] 69 32 41 42
[3,] 87 65 82 56
[4,] 9 77 71 50
[5,] 78 38 83 40
[6,] 89 97 14 12
[7,] 68 49 10 93
> matrix(x,ncol = 7)# col 表示列
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 13 78 32 97 82 10 50
[2,] 69 89 65 49 71 18 40
[3,] 87 68 77 16 83 42 12
[4,] 9 72 38 41 14 56 93
长度和数据类型都相同的向量组成矩阵
> x1=sample(1:100,7);x1
[1] 40 56 74 64 77 27 24
> x2=11:17;x2
[1] 11 12 13 14 15 16 17
> x3=sample(1:10,7);x3
[1] 6 4 9 3 5 7 10
#共同点:结果都是数值型向量,长度相同
> cbind(x1,x2,x3)
x1 x2 x3
[1,] 40 11 6
[2,] 56 12 4
[3,] 74 13 9
[4,] 64 14 3
[5,] 77 15 5
[6,] 27 16 7
[7,] 24 17 10
image.png
长度相同,数据类型不同的向量组成矩阵
> y1=sample(1:100,7);y1
[1] 27 78 57 68 24 85 28
> y2=letters[1:7];y2
[1] "a" "b" "c" "d" "e" "f" "g"
> y3=sample(1:10,7);y3
[1] 5 1 7 9 2 4 6
> data.frame(y1,y2,y3)
y1 y2 y3
1 27 a 5
2 78 b 1
3 57 c 7
4 68 d 9
5 24 e 2
6 85 f 4
7 28 g 6
image.png
list列表:长度及数据类型均可以不同,兼容并包,可以由数据框,向量,矩阵两两或多个自由组合而成
image.png image.png1是向量,2是数据框,3是矩阵,4是列表
数据框和矩阵在R中有两种显示形式
预览模式:有格子;
控制台模式:没格子
当对数据框或者矩阵进行赋值后,它就会出现在environment列表里,点 df
image.png