在我們處理數(shù)據(jù)時,除了對單個表格進行處理,有時還需要對兩個甚至多個表格進行操作。
1.數(shù)據(jù)框拼接:binding
我們現(xiàn)在有一個數(shù)據(jù)框的格式如下:

image
如果有另外一個數(shù)據(jù)框,和其排列相似,如何把兩個數(shù)據(jù)框拼接在一起呢?
(1)生成一個相同格式的數(shù)據(jù)框
# 用R的data.frame函數(shù)創(chuàng)建一個相同格式的數(shù)據(jù)框
gene_exp_tidy2 <- data.frame(GeneId = rep("gene5", times = 3),sample_name = paste("sample", 1:3, sep = ""), expression = 2:4)

image
(2)將兩個數(shù)據(jù)框拼接起來
# 1.使用R自帶的函數(shù)rbind拼接
rbind(gene_exp_tidy,gene_exp_tidy2)
# 2.使用dplyr的bind_rows函數(shù)
bind_rows(gene_exp_tidy,gene_exp_tidy2)

image
binding的具體用法:

image
2.交集、并集、差集
(1)構(gòu)建一個由gene1和gene5組成的數(shù)據(jù)框
gene_exp_tidy3 <- filter(gene_exp_tidy, GeneId == "gene1")%>%
bind_rows(gene_exp_tidy2)

image
(2)求交集、并集和差集
# 求兩個數(shù)據(jù)框的交集
intersect(gene_exp_tidy, gene_exp_tidy3)

image
# 求兩個數(shù)據(jù)框的并集(自動去除重復(fù))
union(gene_exp_tidy, gene_exp_tidy3)

image
# 求兩個數(shù)據(jù)框的并集,不去除重復(fù)
union_all(gene_exp_tidy, gene_exp_tidy3)

image
# 求兩個數(shù)據(jù)框的差集
setdiff(gene_exp_tidy, gene_exp_tidy3)

image
3.內(nèi)連接、左連接、右連接、全連接

image
上圖中,左邊的數(shù)據(jù)框中有基因的表達信息,右邊的數(shù)據(jù)框中有基因的功能注釋,如何把兩個數(shù)據(jù)框相關(guān)聯(lián),將基因功能注釋添加到基因的表達信息中呢?
左連接:以第一個數(shù)據(jù)框為準,將第二個數(shù)據(jù)框的相關(guān)信息添加進去
# 將兩張表以GeneId進行關(guān)聯(lián)
left_join(gene_exp_tidy, gene_anno, by = "GeneId")

image
在上面的例子中。兩張表都有GeneId一列,列名完全相同,如果兩個列名不完全相同時怎么辦呢?
我們先將第二個數(shù)據(jù)框中的GeneId進行修改:
# 使用rename函數(shù)將GeneId換成Geneid
gene_anno <- rename(gene_anno, Geneid = GeneId)
# 將兩個數(shù)據(jù)框關(guān)聯(lián),設(shè)置兩個數(shù)據(jù)框中相同的列名
left_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image
右連接:以第二個數(shù)據(jù)框為準,將第一個數(shù)據(jù)框中的相關(guān)信息添加進去
# 右連接
right_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image
內(nèi)連接:保留兩個數(shù)據(jù)框中共有的GeneId
# 內(nèi)連接
inner_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image
全連接:保留兩張表格中所有GeneId的信息
# 全連接
full_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image
4.半連接、反連接
半連接:只保留第二個數(shù)據(jù)框中包含的GeneId信息
# 半連接
semi_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image
反連接:只保留第二個數(shù)據(jù)框中不包含的GeneId信息
# 反連接
anti_join(gene_exp_tidy, gene_anno, by =c("GeneId" = "Geneid"))

image