两个神奇的R包介绍,外加实用小抄

认识Tidy Data1.Reshape Data2.Handle Missing Values3.Expand Tables4.split cells一、测试数据1.新建数据框2.用tidyr进行处理3.按照geneid排序4.空值操作用表二、Dplyr能实现的小动作1.arrange 排序2.fliter3.distinct4.select5.mutate6.summarise7.bind_rows8.交集、并集、全集9.关联

小抄准备好

1.准备工作 准备好Rstudio 安装tydir:install.packages("tydir") 加载tydir:library(tydir)

2.key-value:键值对 键和值都是列名,如SampleName和Expression的对应。

3.函数后面跟括号,括号里第一个参数是都数据框名

4.字符串要加双引号,行名和列名不用加,其他单元格(姑且这么叫了)里出现的字符串要加。

行 raw

列 column,简化为col

5.有一个问题,你需要先学会新建数据框,才能复制我的示例数据哈哈。

举个例子,看怎么新建

bioplanet<-data.frame(GeneId = rep("gene5",times=3),

SampleName =paste("Sample",1:3,sep=""),

Expression=(14,19,18) 

得到的数据框是

新建一个数据框并赋值给bioplanet这个变量(赋值符号<-还记得嘛)括号里是“列名”=列值,这里列名要加双引号。这里涉及的几个给列填充数值的函数有

rep,重复,括号中填要重复的字符和重复次数。

paste,连接两个字符串,括号要填两个代连接字符并指定分隔符(sep),没有分隔符就填sep=“”。

1:3表示从1到三。如需一列中需要填入三个无规律的数字,可以用向量c(1,3,4),同样如果填是字符串也需要加双引号。

认识Tidy Data

TidyData?泰迪数据是神马数据?我想到了如下两坨:

皮一下我就是很开心!皮完查字典去:

这是一种组织表格数据的方式,提供了一种能够跨包使用的统一的数据格式。

有多统一

每个变量(variable)占一列,每个情况(case,姑且这么翻译)和观测值(observation)占一行。

举个栗子

看到吗?一列是一列,是魔鬼的步伐。不要让sample1,2,3当列名,让他们多重复几遍,合并到一列。

数据由九宫格变成了一列,就可以用来跨包处理啦。

这就是实现了数据框的变形?。

1.Reshape Data

哦,我知道你想要魔法棒,来。

gather:我就是刚才的魔法棒

spread:我能让tidy data一夜回到解放前。

gather括号里的分别是:

数据框名,需合并的列名,合并后的key列名,value列名。

(正常来说列名不需要加‘’,大概是因为示例中这个列名是纯数字的缘故。)

其中,需合并的列名也可以列在最后,这样,key=和value=可以省略。

其中,合并前的列名如果比较多,可以用排除法,在上图例子中可用

gather(table4a,year,cases,-country)

2.Handle Missing Values

处理丢失的数据。就是某些单元格有空值的情况。

三种处理方式:删除整行,根据上下文(瞎)蒙一个,同一列的空值填上同一个数。

drop_na()括号里填数据框名,依据的列名

fill()同上

replace_na()括号里填数据框名,要填的列名=要填的值

3.Expand Tables

1532868312448.png

这个地方,简直看不懂。不过经过一番试验,搞明白了用法。

complete(填空系列)

我用的示例数据是

其中有三个空值,我要填充上ddd relate

1532868462756.png

试了多次,成功了但不知道咋回事。

expand(列出每列值所有可能的组合,天哪我是写到这里的时候刚看懂的!)

来看示例

我是看到了结果才知道我干了啥的喂。就是选中的列中的值各种组合,成为一个新表。(我想给自己打个优秀)

4.split cells

把一列拆成两列。目测要有分隔符才行啊好像。

separate:按列分割

sparate_rows:按行分割

unite:分割完了再合并回去

(此处让我想起一个小学老师,他把学校发的家庭作业本扣下了,让我们写家庭作业的时候每次给发一张纸(separate),说期末给我们一页页订起来(unite),当时我虽然只有十岁,但我知道他八成在骗人。嗯后来用剩下的本子被他贪污了。更恶心的是,竟然有同学以我的纸和别人颜色不一样,不是老师今天发的为由告我的状!!!)

这坨包的操作格式必须是tidy data。 准备工作: 准备好Rstudio 安装tydir:install.packages("dplyr") 加载tydir:library(dplyr)

一、测试数据

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)))

2.用tidyr进行处理

frame1<-gather(frame1,"Sampleid","expression",Sample1,Sample2,Sample3)

3.按照geneid排序

frame1<-arrange(frame1,geneid) 

4.空值操作用表

由于涉及空值操作,再新建一个

frame2<-data.frame(geneid = paste("gene",1:3,sep=""),annotion=paste( c("aaa","bbb","ccc"),"relate") )
left_join(frame1,frame2,by="geneid")

二、Dplyr能实现的小动作

1.arrange 排序

按某一/两列值的大小,按照升/降对行排序。

举三个栗子

arrange(data,col1) 

arrange(data,col1,col2)#在按col1排序的基础上,按col2排序

arrange(data,col1,desc(col2))

2.fliter

按行筛选 (筛选符合要求的行)

举三个栗子

filter(data,col3>1) 
filter(data,col3>1|col1=="gene1") #“|”表示or,或者。
filter(tidy2,Expression>1) %>% 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) 
mutate(frame3,E=expression*10) %>% select(-expression) 
mutate(frame3,id=paste("ath",GeneId,sep = "_")) %>% select(-geneid) 
mutate(frame3,id=paste("ath",GeneId,sep = "_")) %>% select(id,SampleName,Expression) 
mutate(frame3,he=cumsum(Expression)) %>% select(-GeneId) 

6.summarise

对数据进行简单统计

summarise(frame3,avg=mean(expression)) #对expression列平均值
frame3 %>% group_by(geneid)%>%summarise(avg=mean(expression))#按照geneid分组并求平均值(更有意义),请注意这里分组的函数。
#%>%是管道操作符(想起了linux的 |)

7.bind_rows

表格拼接(按行拼接)

先新建一个frame4用于拼接(由于我懒,所以直接从frame1筛选几行生成一个)

frame4<-filter(frame1,Sampleid=="Sample1")

两种办法拼起来~

一个是R自带的rbind,一个是dplyr里的bind_rows

按行拼接时,列数、列名需要一致

rbind(frame1,frame4)#
frame1 %>%bind_rows(frame4)

8.交集、并集、全集

intersect(frame1,frame4)
union(frame1,frame4)
union_all(frame1,frame4)

这图是我用ppt画的

交集并集巴啦啦的可是高中数学第一册第一章,我记得好清楚。(给自己卡个优秀)

intersect是中间阴影,union是包括AB全部,重复部分出现一次。

union后加上all,重复部分不会被筛出,出现两次。

9.关联

关联分两组:左右内全和半反。

左连接:把表2添加到表1

left_join(frame1,frame2)

右连接:把表1添加到表2

right_join(frame1,frame2)

inner_join:只保留两个表格共有的行

full_jion:保留全部的行

left,right,inner,full_join

注意下,截图中我打出的命令下面有一行蓝字,写了by ="geneid"。这是根据相同的列名进行合并,当在两个表格中列名不一样时,需要在括号内加

by=c("col1"="col2")

其中col1和2分别是在两个表格中的需合并的列名

semi_joinanti_join

这两种关联方式都是以表格1为基础,根据表格2与其共有的那一列进行筛选。

semi_join只保留第二个表格中包含的id

只是把表1中的gene4去掉了,但并没有加上表2的annotion列。

anti-join只保留第二个表格中不包含的id

哦,忘记说了,这些R包是有对应的小抄的,如果你还不懂什么是小抄,请出门自行谷歌了解一下哈!

在我们生信技能树后台回复 小抄 或者 cheatsheet 即可获取哈。

原文发布于微信公众号 - 生信技能树(biotrainee)

原文发表时间:2018-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏耕耘实录

Linux三大剑客之awk

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

17840
来自专栏程序员维他命

iOS 代码规范

花了一个月的时间结合几篇博客和书籍写了这套 iOS 代码规范(具体参考底部的参考文献部分)。这套代码规范除了有仅适用于 iOS 开发的部分,还有其他的比较通用性...

23220
来自专栏社区的朋友们

iOS 中的 Promise 设计模式

无论是代理模式,还是闭包,在处理单一任务的时候,都出色的完成了任务。可是当两种模式要相互配合,一起完成一系列任务,并且每个任务之间还要共享信息,相互衔接,雇主就...

2.4K10
来自专栏Java帮帮-微信公众号-技术文章全总结

【选择题】Java基础测试题一(10道)

【选择题】Java基础测试题一(10道) 1.下面哪些是合法的变量名? (DEG) A.2variable //不能以数字开头 ...

47480
来自专栏逸鹏说道

如何让所有实体类用相同名称的主键(很有力的问题,比如所有表实体主键都用ID)

这个问题比较有力量,哈哈! 例如:有两个表userbases和products 两个表的主键分别为UserID和ProductID,那么,我想问有没有一种方法把...

31950
来自专栏技术博客

Entity Framework DataAnnotations

DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。但是在EF中它又可以对映射关系进行控制,相比较Fluent...

9930
来自专栏coolblog.xyz技术专栏

自己动手实现一个简单的JSON解析器

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式 XML,JSON 有着诸多优点。比如易读...

710190
来自专栏finleyMa

PHP7 新语法总结,更新7.2注意事项

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1

44920
来自专栏Android开发指南

用最简单的例子说明设计模式(一)之单例模式、工厂模式、装饰模式、外观模式

45950
来自专栏Android知识点总结

自己写一个svg转化为安卓xml的工具类

35520

扫码关注云+社区

领取腾讯云代金券