数据处理R包-第二枚

作者: 小洁忘了怎么分身 | 来源:发表于2018-07-31 23:00 被阅读22次

    Dplyr

    这坨包的操作格式必须是tidy data。

    一、测试数据

    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)
    

    内连接:只保留两个表格共有的行

    全连接:保留全部的行

    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包-第二枚

        本文链接:https://www.haomeiwen.com/subject/kpskvftx.html