R-基础(五):数据框-双表操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43700050/article/details/102710704

在我们分析数据过程中,不仅仅是处理一个数据集,也会组合两个数据集,这时候就可以用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

猜你喜欢

转载自blog.csdn.net/weixin_43700050/article/details/102710704
今日推荐