#本文引用自生信技能树
【课前概念辨析】
1. 变量(本身是变量也是一个名字)=是一种容器,包含向量、数据框、任何
变量这个名称只是对使用者起提示作用,不起决定作用
eg. x/y/z,都是可变的东西。
2.向量是一维的【r语言的一个数据,可以被赋值】=是被装进变量里的东西,是固定的
eg.数字1:5、字符串“a”、“b”、逻辑值“T”“F”“T”
3.“表格”是二维的【为什么要学,因为有些函数只接受某种表格】
matrix 矩阵-二维:只允许一种数据类型
data.frame 数据框-二维:每列只允许一种数据类型
list列表:可装万物、看成一个大盒子
4.可用class/is判断函数类型,as族函数可生成其他的函数
!【上课内容】!
一、数据框【将内容作成表格、画图】
来源:1.代码新建、2.读取表格文件、3.现有数据转换或处理、4.R语言内置数据
1.用代码新建一个名为df1的数据框
df1 <- data.frame(gene=paste0("gene",1:4),
在gene的那一列,有1到4个数,并且与gene结合
eg.
gene
1 gene1
2 gene2
3 gene3
4 gene4
>change=rep(c("up","down"),each = 2),
在change的那一列重复up和down,每个两次
eg.
change
up
up
down
down
>df1$change=rep(c("up","down"),times=2),
eg.
change
up
down
up
down
score = c(5,3,-2,-4))
给score赋值5,3,-2,-4
说明:<-赋值,data.frame生成数据框的函数,gene、change、score是列名、=等于号后面的是函数,函数里面的内容就是列的内容,三个列名分别用逗号隔开。
eg.
score
5
3
-2
-4
2.从文件中读取read函数
变量<-read.文件类型(“文件名”)
eg.
>df2 <- read.csv("gene.csv");df2
报错情况:
如果没有用R.project的方式打开工作目录,而你所要的目的文件在project里,就算你输入的代码是正确的你也是是打不开的!
正确处理:只有你所要读取的目的文件在你开着的R.project的同个文件夹中才能运行代码打开
3.数据框的属性【这个属性是指数据框中黑色加粗的字体,不属于表格内容!只是表格的属性!不在行列统计范围内】
df1.csv
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
统计一个数据有几行几列的函数是dim【与dim类似的函数是table】
>dim(df1) 维度
[1] 4 3 有四行三列
>a=iris
table(a)会统计每个值出现的次数
0.1 0.2 0.3 0.4 0.5
5 29 7 7 1
0.6 1.0 1.1 1.2 1.3
1 8 4 7 20
1.4 1.5 1.6 1.7 1.8
21 25 11 6 12
1.9 2.0 2.1 2.2 2.3
7 7 6 6 12
2.4 2.5 2.6 2.7 2.8
6 11 5 9 14
2.9 3.0 3.1 3.2 3.3
10 27 11 13 8
3.4 3.5 3.6 3.7 3.8
12 8 5 4 7
3.9 4.0 4.1 4.2 4.3
5 6 4 5 3
4.4 4.5 4.6 4.7 4.8
8 9 7 7 9
4.9 5.0 5.1 5.2 5.3
11 14 17 6 3
5.4 5.5 5.6 5.7 5.8
8 10 12 11 10
5.9 6.0 6.1 6.2 6.3
5 8 9 4 10
6.4 6.5 6.6 6.7 6.8
8 5 3 10 3
6.9 7.0 7.1 7.2 7.3
5 1 1 3 1
7.4 7.6 7.7 7.9
1 1 4 1
setosa versicolor virginica
50 50 50
使用table时,可以将数据框中某列指定为向量或因子变量
>df1$change <- factor(df1$change)
table(df1$change)
down up
2 2
3.处理数据框的常用函数:
df1.
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
1)nrow()#回答多少行的函数
> nrow(df1)
[1] 4
2)ncol()#回答多少列的函数
> ncol(df1)
[1] 3
3)rownames()#回答行名是什么
> rownames(df1)
[1] "1" "2" "3" "4"
4)colnames()#回答列名是什么
> colnames(df1)
[1] "gene" "change" "score"
4.数据框取子集【只适用于数据框!并不适用于矩阵数据】
df1.
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
【小心矩阵!不能用$】【矩阵可以用中括号,y[]】
1)提取数据框的列名函数$:df1$change 【一次只能取一列】
[1] "up" "up" "down" "down"
2)平均值的函数:
mean(df1$score)
【数字运算时,小心字符!因为做运算,字符是做不了运算的,所以记得用class,
如果是字符,要改!记得改全部!】
3)按坐标取子集,用中括号表示[行,列]:
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
eg.[行,列] 【2,】是取的是第二个行;【,2】取出的是第二列向量
> df1[2,2]
[1] "up"
> df1[2,]
gene change score
2 gene2 up 3
> df1[,2]
[1] "up" "up" "down" "down"
4)中括号里的逗号,是维度的分割
【中括号是取子集的函数】
eg. > df1[c(1,3),1:2]
中括号表示是取df1中的数据,c(1,3)是取第一行和第三行的数据,逗号表示维度的分割,1:2是取第一列与第二列的数据
eg.
gene change
1 gene1 up
3 gene3 down
5)向量x只有一个维度=只有一行,无法取行列;
只有数据框或矩阵才有两个以上的维度才可以直接用中括号取子集
>x[1,5] 不可以
>x[c(1,5)] 可以运行,c(1,5)是一个长度为2的整数向量,它告诉R语言要选择x向量中的第1个和第5个元素。
x=1,2,3,4,5
[1] 1 5
6)数据框取自己,按名字提取列信息
变量[“行名”,”列名“]
df1
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
eg.
> df1[,"gene"] 取gene基因这一列的数据
[1] "gene1" "gene2" "gene3" "gene4"
> df1[,c('gene','change')] 取gene和change这一列的数据
gene change
1 gene1 up
2 gene2 up
3 gene3 down
4 gene4 down
7)#按(逻辑值)条件筛选基因,用中括号[]将条件包裹【!取出来的是符合条件的子集】
筛选score > 0的基因
> df1[df1$score > 0,]内容写在逗号前取子集是按行来取子集
取df1数据框中score那一列大于0的df1值如第一行、第二行
gene change score
1 gene1 up 5
2 gene2 up 3
> df1$score > 0
[1] TRUE TRUE FALSE FALSE
df1:
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
> df1$gene[df1$score > 0]
[1] "gene1" "gene2"
> df1[df1$score > 0,]
gene change score
1 gene1 up 5
2 gene2 up 3
【用于取子集的逻辑值向量:需要与x对应,不必须由x生成
x=c(30,50,60,38)
y=c("jj","ss","ff","tt")
y[x>40]---这样是不可以的
x与y有对应关系!才可以!】
8)如何取数据框的最后一列?
变量[,ncol(变量)]这个函数:与最后一列绑定!!当用于批量处理的时候!更加方便
df1:
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
>df1[,ncol(df1)]
> df1[,3]
[1] 5 3 -2 -4
9)如何取数据框除了最后一列以外的其他列?用减号!-
> df1[,-ncol(df1)]
gene change
1 gene1 up
2 gene2 up
3 gene3 down
4 gene4 down
【减号是按照数字和位置来取,!叹号才是是逻辑值取否】
10)数据框的修改=赋值
df1:
gene change score
1 gene1 up 5
2 gene2 up 3
3 gene3 down -2
4 gene4 down -4
(1)改一个格:变量[行,列]=修改值
> df1[3,3] <- 5
> df1
(2)改一整列:变量$列名=c()修改值
> df1$score <- c(12,23,50,2)
> df1
gene change score
1 gene1 up 12
2 gene2 up 23
3 gene3 down 50
4 gene4 down 2
(3)新增一列!:变量$新的列名【就是新增一列!/原有命名则会修改原本数值】
df1$p.value <- c(0.01,0.02,0.07,0.05)
> df1
gene change score p.value
1 gene1 up 12 0.01
2 gene2 up 23 0.02
3 gene3 down 50 0.07
4 gene4 down 2 0.05
(4)改行名和列名【本质是向量、字符串】
改全部行名:rownames(变量)=c(“”,“”,“”,“”)
> rownames(df1) =c("r1","r2","r3","r4")
eg.
将行名改为flower1、2、3、4、5、
rownames(a)= paste0("flower",1:nrow(a))
1:nrow(a)行名是取1到a个数值的数,1、2、3...完全不会出问题!
只修改某一列名:colnames(变量)[第几列]=修改值“”
> colnames(df1)[2] <- "CHANGE"
(5)两个数据框的连接【智能的连接】
【使用:差异分析结果,分析基因的结果,注释的信息,对应每个基因的连接】
函数:merge( ,by=“共同的列的列名”记得打引号!)
eg.x=test1,y=test3
merge(test1,test3,by.x="name",by.y="NAME“)
大小写相同的同列名!内容有交集,要想连接!可以先改成一样的!!as()——转变
【可自行搜索-左连接、右连接、取合集】【如何按照数据框的某一列给整个数据框排序/去重复】
【内置数据有数据框,但不是所有都是数据框】
-------------------------------------------------------------------------------
(6)矩阵新建和取子集【不支持$】
1.#新建矩阵:变量=matrix();nrow最后一行是3
m <- matrix(1:9, nrow = 3)
2.#加列名:colname(变量)=c("","","")
> colnames(m) <- c("a","b","c")
> m
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> m[2,]行
a b c
2 5 8
> m[,1]列
[1] 1 2 3
> m[2,3]
c
8
> m[1:2,1:2]
a b
[1,] 2 5
[2,] 3 6
> m
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
(7)注意: #单独as的时候!是不会改变数据结构,应该赋值!
as.data.frame(m)
a b c
1 1 4 7
2 2 5 8
3 3 6 9
>class(m)
matrix\array
>m=as.data.frame(m)!应该赋值!!!
【R语言里的修改,都要赋值!!!,没有赋值就没有发生过】
>class(m)
"data.frame"
(8)矩阵画热图!!!热图必须用矩阵!!---热图是矩阵的可视化!
应该有对应关系!
> m
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>pheatmap::pheatmap(m,cluster_cols=T,cluster_row=T)
聚类树-相似的行和列相互凑--展示数据变化及变化规律
>pheatmap::pheatmap(m,cluster_cols=F,cluster_row=F)
只有当不聚类时,格子才与数字一一对应;什么样的数据出什么样的图!
【当默认的设置不符合你的预期,可以在作者允许的范围内自定义】
(9)列表新建和取子集
#list生成列表、矩阵的函数【包容性很强!】
<-list(m1=matrix(1:9,nrow=3),
m2 = matrix(2:9, nrow = 2))
> l叫l的列表装着矩阵
$m1元素
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$m2元素
[,1] [,2] [,3] [,4]
[1,] 2 4 6 8
[2,] 3 5 7 9
画图时要拿表格中的子集取出来才能画图!!!
两种提取方式!!
(10)从列表中提取矩阵
【矩阵】l[[2]]只把矩阵提取出来!用两个中括号
[,1] [,2] [,3] [,4]
[1,] 2 4 6 8
[2,] 3 5 7 9
l$m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
(11)元素的名字names(变量)=c(“”)
> scores = c(100,59,73,95,45)
> names(scores) = c("jimmy","nicker","Damon","Sophie","tony")--每一个元素的名字
> scores【向量!加名字还是向量】
jimmy nicker Damon Sophie tony
100 59 73 95 45
【加上了名字,向量的元素还是五个数字,名字是向量的属性!不属于正文!不影响!】
作用:直观!取子集!
> scores["jimmy"]
jimmy
100
> scores[c("jimmy","nicker")]
jimmy nicker
100 59
> names(scores)[scores>60]
[1] "jimmy" "Damon" "Sophie"
【向量取子集的代码,y[x>0],x[y],x与y有关联有对应,人名与分数相关
(12)删除变量
函数:
删除一个rm(l)
删除多个 rm(df1,df2)
清空控制台ctrl+l不等于数据消失
!!!删除全部【固定命令】> rm(list = ls()) --ls列出环境里有哪些变量
清空环境所有的变量
【课堂作业】
1.筛选出向量g中下标为偶数的基因名。
g[seq(2,100,2)] 因为g有100个数据
2.向量g中有多少个元素在向量s中存在(要求用函数计算出具体个数)
table()函数来取
table(g%in%s)
FALSE TRUE
37 63
3.[]取交集的时候会去重复,而%in%取子集不会去重复【要不要去重复】
4.需要撤回时,可用函数:set.seed(10086) rnorm(10),代码运行了没办法赋值
5.<-容易成赋值,加空格就可以,还可以加()括起来可以分割!
6.代码不报错,不代表真的没错,要检查目的是否达到【不报错是最低要求】
7.判断答案是否正确,与会不会代码无关
9求test第一列数值的中位数
median(test$Petal.Length)
median(test[,1])
10.筛选test中,Species列的值为a或c的行
反选和列出所有条件
test[test$Species!="b",]
test[test$Species=="a"|test$Species=="c",]
【test[test$Species=="a"|“c",]无法运行,因为前后向量不行
operations are possible only for numeric, logical or complex types】
必须test[test$Species=="a"|test$Species=="c",]
!!!%in%很重要!!!多用!因为当筛选的条件很多时,用百分百in更快
test[test$Species %in% c("a","c"),]
==是等位运算,一一对应的!对应的有顺序的!
10.如果没有逗号,直接(a)取的是列!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。