文章目录
- 1 rbind()、cbind()函数合并数据集
- 2 dplyr包组合数据集
- 2.1 按行组合
- 2.2 按列组合
在我们分析数据过程中,不仅仅是处理一个数据集,也会组合两个数据集,这时候就可以用dplyr
包进行相关的操作,当然这些操作也可以分为两大类:按行组合和按列组合。
在使用dplyr
包之前,我想先介绍R中两个基础函数rbind()
函数和cbind
函数。这两个函数只能满足简单的需求,主要是用来完全合并两个数据集。
rbind()
函数作用是按行合并,使用前提是两个数据集列名相同,cbind()
函数作用是按列合并,cbind()
函数只要求两个数据集的行数相同就可以,合并后的数据集的行名会默认为前一个数据集的行名。
1 rbind()、cbind()函数合并数据集
新建两个数据集
options(stringsAsFactors = F) #全局变量中字符串不改为因子
x = data.frame(A = c('a','b','c'),
B = c('t','u','v'),
C = 1:3)
rownames(x) = c('rx1','rx2','rx3')
y = data.frame(A = c('a','b','d'),
B = c('t','u','w'),
D = c('3','2','1'))
rownames(y) = c('ry1','ry2','ry3')
rbind()
函数按行合并两个数据集
c = rbind(x[,1:2],y[,1:2])
c
## A B
## rx1 a t
## rx2 b u
## rx3 c v
## ry1 a t
## ry2 b u
## ry3 d w
cbind()
函数按列合并两个数据集
d = cbind(x,y)
d
## A B C A B D
## rx1 a t 1 a t 3
## rx2 b u 2 b u 2
## rx3 c v 3 d w 1
2 dplyr包组合数据集
2.1 按行组合
新建两个数据集
x = data.frame(A = c('a','b','c'),
B = c('t','u','v'),
C = 1:3)
x
## A B C
## 1 a t 1
## 2 b u 2
## 3 c v 3
y = data.frame( A = c('c','d'),
B = c('v','w'),
C = c(3,4))
y
## A B C
## 1 c v 3
## 2 d w 4
intersect()
函数取交集,取两个数据集共有的行
intersect(x,y)
## A B C
## 1 c v 3
union()
函数取并集,取两个数据集所有的行,并且去除重复行
union(x,y)
## A B C
## 1 a t 1
## 2 b u 2
## 3 c v 3
## 4 d w 4
setdiff()
函数取补集,只在一个数据集中存在的行
setdiff(x,y)
## A B C
## 1 a t 1
## 2 b u 2
2.2 按列组合
新建两个数据集
x = data.frame(R = c('a','b','c'),
N = c('t','u','v'),
G = 1:3)
y = data.frame(F = c('a','d','b','f'),
P = c('a','w','t','u'),
X = 4:7)
为了方便后面解释,定义一个连接变量:
- 通过数据集x中变量R和数据集y中变量F将两个数据集连接在一起,形成一个新的数据集,那么这两个变量称都为连接变量
left_join()
函数进行左连接:数据集y通过连接变量合并到数据集x上,数据集y只保留两个连接变量中共同元素所在的行,其余位置用NA
替代。
left_join(x,y,by = c('R'='F'))
## R N G P X
## 1 a t 1 a 4
## 2 b u 2 t 6
## 3 c v 3 <NA> NA
right_join()
函数进行右连接:右连接和左连接作用恰好相反,相当于左连接中两个数据集互换位置。
right_join(x,y,by = c('R'='F'))
## R N G P X
## 1 a t 1 a 4
## 2 d <NA> NA w 5
## 3 b u 2 t 6
## 4 f <NA> NA u 7
inner_join()
函数进行内连接:通过连接变量合并数据集x和数据集y,并且取两个连接变量共同元素所在的行。
inner_join(x,y,by = c('R'='F'))
## R N G P X
## 1 a t 1 a 4
## 2 b u 2 t 6
full_join()
函数进行全连接:通过连接变量合并数据集x和数据集y,取两个数据集的所有行,用NA
表示缺失值
full_join(x,y,by = c('R'='F'))
## R N G P X
## 1 a t 1 a 4
## 2 b u 2 t 6
## 3 c v 3 <NA> NA
## 4 d <NA> NA w 5
## 5 f <NA> NA u 7
semi_join()
函数进行半连接:提取数据集x中两个连接变量共有元素所在的行,因此semi_join()
函数和match()
函数功能很相似。
semi_join(x,y,by = c('R'='F'))
## R N G
## 1 a t 1
## 2 b u 2
anti_join()
函数进行反连接:提取数据框x中仅存在于连接变量R中的元素所在的行。
anti_join(x,y,by = c('R'='F'))
## R N G
## 1 c v 3
当两个连接变量名相同时,可以简化为:
y = rename(y,R = F) #将数据集y中的变量F重新命名为R
left_join(x,y,by = 'R')
## R N G P X
## 1 a t 1 a 4
## 2 b u 2 t 6
## 3 c v 3 <NA> NA