R语言-tidyr和dplyr

时间:2022-09-13 09:51:20

一、安装和加载

1、安装并加载tidyr和dplyr包

install.packages("tidyr")
library(tidyr)
install.packages("dplyr")
library(dplyr)

2、读取数据

expression <- read.delim("gene_expression.txt",sep="\t",header = T)

二、tidyr包操作

%>%    #用于实现将一个函数的输出传递给下一个函数的第一个参数。相当于管道,优先级高于赋值
stocksm <- stocks %>% gather(stock, price, -time) #先执行右面的,结果赋值给stocksm

#短数据变成长数据
tidy_gather <- gather(data=expression,key=Samplename,value = Expression,-id)
data  #“数据框名”
#关于key-value,原始数据一个“列名-列值”对应一个“key-value”
key   #“key名”,新生成的key列,值为转化的列的列名
value #“value名”,新生成的value列,值为对应列名的列的值,
...   #列的选择。如果为空,则选择所有变量。可以提供裸变量名,使用x:z选择x和z之间的所有变量,使用-y排除y。

#长数据变短数据
tidy_spread <- spread(tidy_gather,key=Samplename,value = Expression) #gather逆向

#按列分割
#给定正则表达式或字符位置向量,separate()会将单个字符列转换为多个列。
separate(
  data,    #数据框
  col,     #要分割的列名或位置
  into,    #作为字符向量创建的新变量的名称。使用NA来省略输出中的变量。
  sep = "[^[:alnum:]]+",  #列之间的分隔符。sep的数量应该比into少1。
#如果是字符,sep被解释为正则表达式。默认值是匹配任何非字母数字值序列的正则表达式。
#如果是数字,sep被解释为要在其中拆分的字符位置。正值从字符串最左边的1开始;负值从字符串最右边的-1开始。
  remove = TRUE,    #如果为TRUE,则从输出数据帧中移除输入列。
  extra = "warn",   #如果sep是一个字符向量,这将控制当有太多片段时发生的情况。有三个有效的选项:
#"warn"(默认):发出警告并删除额外值。
#"drop":在没有警告的情况下删除任何额外的值。
#"merge":只分割最多(into)次
  fill = "warn",    #如果sep是一个字符向量,这将控制当没有足够的片段时发生的情况。有三个有效的选项:
#"warn"(默认):发出警告并从右侧填充
#"right":填充右边缺失的值
#"left":在左边填充缺失的值
)
#按列合并
tidy_unite <- 
unite(tidy_separate,col=Samplename,into=c("Source","Samplename"),sep="_")

三、dplyr包操作

#按id进行排序
dplyr_arrange <- arrange(tidy_gather , id ) 

#按id进行排序的基础上按Expression的降序排列,后面可以继续添加其他变量
dplyr_arrange1 <- arrange(tidy_gather,id,desc(Expression)) 
dplyr_arrange1 <- arrange(tidy_gather,id,-Expression) #desc()可以用-替代

#排序时添加分组
mtcars %>% group_by(cyl)%>% arrange(desc(wt), .by_group = TRUE)

#筛选行
filter(starwars, hair_color == "none" & eye_color == "black")
filter(starwars, hair_color == "none", eye_color == "black")  #相当于使用 &
filter(starwars, hair_color == "none" | eye_color == "black")

#加管道筛选
starwars %>% filter(mass > mean(mass, na.rm = TRUE))
starwars %>% group_by(gender) %>% filter(mass > mean(mass, na.rm = TRUE))
Result <- filter( tidy_gather , Expression>1 ) %>% arrange( Expression )

#展示指定的GeneId SampleName  Expression 列
dplyr_select <- select( tidy_separate , id , Samplename , Expression )
dplyr_select <- select( tidy_separate , -Source )  #可使用-排除

#增加新列,将现有的字段经过计算后生成新字段。
dplyr_mutate <- mutate( tidy_gather , ID=sub( "gene", "Gene", id ) ) #sub函数将id列的"gene"替换为"Gene"

#分组统计
mtcars %>%
+     group_by(cyl) %>%
+     summarise(mean = mean(disp), n = n())   #根据cyl分组,统计各组中disp的平均值以及组的大小

#按行合并,行索引
bind_rows(a , c)

#按列合并,列索引
bind_cols(a , c)

#取并集,按列索引
union(a , c)

#取差集,按列索引,保留a不同于c的部分
setdiff(a , c)

#内连接,按行,只保留a、b共有的x1值的行
inner_join(a,b,by=“x1”)

#全连接,按行,保留全部,空值用NA补齐
full_join(a,b,by=“x1”)

#左连接,按行,其中a全部保留
left_join(a,b,by=“x1”)

#右连接,按行,其中b全部保留
right_join(a,b,by=“x1”)

#a中所有在b中匹配的行
semi_join(a,b,by=“x1”)

#a中所有在b中不匹配的行
anti_join(a,b,by="x1")