这坨包是对表格进行进一步操刀的工具,还是属于数据处理的基本功。值得一提的是,他的操作格式必须是tidy data,这就要用到神器tidyr了。
这个教程代码必须手打,不要复制,否则练不好的。
首先还是要下载:
install.packages("dplyr")
加载:
library(dplyr)
下面要用到tidyr,所以也加载一下
library(tidyr)
一、测试数据
1.新建数据框
frame1<-data.frame(geneid=paste("gene",1:4,sep=""),Sample1=c(1,3,6,9),Sample2=c(2,5,0.8,11),Sample3=(c(40,70,80,35)))
![](https://img.haomeiwen.com/i9475888/62b6c193cebe81e9.png)
2.用tidyr进行处理
frame1<-gather(frame1,"Sampleid","expression",Sample1,Sample2,Sample3)
![](https://img.haomeiwen.com/i9475888/00ccbbedf2b3df54.png)
3.排序
现在是按照Sampleid列排序的,我们按用geneid排:
frame1<-arrange(frame1,geneid)
(这里的arrange命令下面会讲到)
![](https://img.haomeiwen.com/i9475888/59bb9bd18e5abe6f.png)
4.空值操作用表
由于涉及空值操作,再新建一个frame2
frame2<-data.frame(geneid = paste("gene",1:3,sep=""),annotion=paste( c("aaa","bbb","ccc"),"relate") )
(请大胆忽略报错信息)
![](https://img.haomeiwen.com/i9475888/9a0b46b718b9521e.png)
frame3<-left_join(frame1,frame2,by="geneid")
![](https://img.haomeiwen.com/i9475888/ee80a66c4aa7323c.png)
(这里用到的left_join命令,下面会讲到)
二、Dplyr能实现的小动作
1.arrange 排序
按某一/两列值的大小,按照升/降对行排序。
举三个栗子
arrange(frame1,geneid) #这是刚才准备测试数据时写下的
arrange(frame1,geneid,expression)#在按col1排序的基础上,按col2排序
arrange(frame1,geneid,desc(expression))
(这里请新手注意一个问题:如果你不赋值,直接打命令的话,结果会出现在控制台,但变量不会改变。但你加上赋值,会改变变量本身,并出现在左上窗口里。)
2.fliter
按行筛选 (筛选符合要求的行)
举三个栗子
filter(frame1,expression>3)
filter(frame1,expression>3|geneid=="gene2") #注意“|”表示or,或者。
filter(frame1,expression>3) %>% arrange(expression) #筛选后排序
#%>%是管道操作符,将第一个函数的结果输出为第二个结果的操作文件,可以少些重复。
(这开发者符合我的审美啊,懒惰是一种美德!)
3.distinct
去除重复行(其实就是列出某一/两列所有的不同值)
distinct(frame1,geneid)
distinct(frame1,geneid,Sampleid)
4.select
按列筛选(选择符合要求的列)
select(frame3,geneid,expression) #选择特定两列
select(frame3,-Sampleid) #反选,all but Sampleid
select(frame3,contains("n")) #列名包含n的列
select(frame3,starts_with("a")) #以a开头的列
5.mutate
根据原有的列生成新的列
mutate(frame3,E=expression *10) #生成新列E,是expression列值的10倍
mutate(frame3,E=expression*10) %>% select(-expression) #生成新列后,去掉把原有的expression列
mutate(frame3,id=paste("ath",geneid,sep = "_")) %>% select(-geneid) #(在列添加前缀ath)
mutate(frame3,id=paste("ath",geneid,sep = "_")) %>% select(id,Sampleid,expression) #和上一行本质上是一样的,这行比较笨
mutate(frame3,cum=cumsum(expression)) %>% select(-geneid) #请查一下cumsum这个函数的意思
6.summarise
对数据进行简单统计
summarise(frame3,avg=mean(expression)) #对expression列平均值
frame3 %>% group_by(geneid)%>%summarise(avg=mean(expression))#按照geneid分组并求平均值(更有意义),请注意这里分组的函数group_by。
#%>%是管道操作符(想起了linux的 |)
![](https://img.haomeiwen.com/i9475888/e3c5f40da47d5db2.png)
7.bind_rows
表格拼接(按行拼接)
先新建一个frame4用于拼接(由于我懒,所以直接从frame1筛选几行生成一个)
frame4 <- filter(frame1,expression>8)
两种办法拼起来~
一个是R自带的rbind,一个是dplyr里的bind_rows
按行拼接时,列数、列名需要一致,否则报错
rbind(frame1,frame4)
frame1 %>%bind_rows(frame4)
结果就是---俩表粘起来了呗。也不管有没有重复行什么的就这么粗暴。(当然有重复行了。。。)
8.交集、并集、全集
intersect(frame1,frame4)
union(frame1,frame4)
union_all(frame1,frame4)
![](https://img.haomeiwen.com/i9475888/17832a590b1c4fbf.png)
交集并集巴啦啦的可是高中数学第一册第一章,我记得好清楚。(给自己卡个优秀)
intersect是中间阴影,union是包括AB全部,重复部分出现一次。
union后加上all,重复部分不会被筛出,出现两次。
9.关联
关联分两组:左、右、内、全和半、反。
第一组::左、右、内、全连接
左连接:把表2添加到表1
left_join(frame1,frame2)
![](https://img.haomeiwen.com/i9475888/d6dd905e88843c6b.png)
右连接:把表1添加到表2
right_join(frame1,frame2)
![](https://img.haomeiwen.com/i9475888/93f2b0fb3b7b77e4.png)
内连接:只保留两个表格共有的行inner_join(frame1,frame2)
全连接:保留全部的行full_join(frame1,frame2)
注意下,截图中我打出的命令下面有一行蓝字,写了by ="geneid"。这是根据相同的列名进行合并,当在两个表格中列名不一样时,需要在括号内加
by=c("col1"="col2")
其中col1和2分别是在两个表格中的需合并的列名
(2)半、反连接
也就是semi_join,anti_join。这两种关联方式都是以表格1为基础,根据表格2与其共有的那一列进行筛选。
•semi_join只保留第二个表格中包含的id
![](https://img.haomeiwen.com/i9475888/ccb53b68936acf8e.png)
只是把表1中的gene4去掉了,但并没有加上表2的annotion列。
•anti_join只保留第二个表格中不包含的id
![](https://img.haomeiwen.com/i9475888/2807d43202cd1b99.png)
网友评论