R语言 数据操作

用dplyr()拼接

dplyr提供了一种很好的、方便的方法来组合数据集。我们可能有许多输入数据源,在某些时候,我们需要合并它们。使用dplyr的连接将变量添加到原始数据集的右侧。dplyr的优点在于它可以处理四种类似于SQL的连接。

  • Left_join()
  • right_join()
  • inner_join()
  • full_join()

首先,我们构建两个数据集。表1包含两个变量ID和y,而表2收集ID和z。在本例中,ID是关键变量。该函数将在两个表中查找相同的值,并将返回的值绑定到表1的右侧。


library(dplyr)
df_primary <- tribble(
  ~ID, ~y,
   "A", 5,
   "B", 5,
   "C", 8,
   "D", 0,
  "F", 9)
df_secondary <- tribble(
  ~ID, ~y,
   "A", 30,
   "B", 21,
   "C", 22,
   "D", 25,
   "E", 29)

left_join()

合并两个数据集最常见的方法是使用left_join()函数。

从下面的图中我们可以看到,两个数据集中的A、B、C和D行与键对完全匹配。但是,E和F是互相不同。

使用left_join(),将保留原始表中的所有变量,不考虑目标表中没有键对的变量。

  • 在示例中,表1中不存在变量E。因此,该行将被删除。
  • 变量F来自原始表格;它将保留,但在合并后的z列中值为NA
两个数据集用left_join()合并的示例
两个数据集用left_join()合并的示例

语法:


left_join(df_primary, df_secondary, by ='ID')

A tibble: 5 x 3
      ID   y.x   y.y
     		
 1     A     5    30
 2     B     5    21
 3     C     8    22
 4     D     0    25
 5     F     9    NA	

right_join()

right_join()函数的工作方式与left_join()完全相同。唯一的区别是被删除的行。目标数据帧中可用的值E存在于新表中,它取列y的值NA。

两个数据集用right_join()合并的示例
两个数据集用right_join()合并的示例

right_join(df_primary, df_secondary, by = 'ID')
A tibble: 5 x 3
      ID   y.x   y.y
     
 1     A     5    30
 2     B     5    21
 3     C     8    22
 4     D     0    25
 5     E    NA    29

inner_join()

当我们100%确定两个数据集不匹配时,可以考虑只返回两个数据集中共同存在的行。当我们需要一个干净的数据集,或者当我们不想用平均值或中位数填充缺失的值时,这是可行的。

inner_join()函数会排除不匹配的行:

 inner_join()函数工作原理
inner_join()函数工作原理

inner_join(df_primary, df_secondary, by ='ID')

A tibble: 4 x 3
      ID   y.x   y.y
     
 1     A     5    30
 2     B     5    21
 3     C     8    22
 4     D     0    25

full_join()

最后,full_join()函数保留所有观察结果,并用NA替换丢失的值。

full_join()函数工作原理
full_join()函数工作原理

full_join(df_primary, df_secondary, by = 'ID')

A tibble: 6 x 3
      ID   y.x   y.y
     
 1     A     5    30
 2     B     5    21
 3     C     8    22
 4     D     0    25
 5     F     9    NA
 6     E    NA    29

多个键对

最后,我们考虑数据集中有多个键。参考以下数据集,其中包含客户购买的年份或产品列表。

数据集中有多个键
数据集中有多个键

如果我们试图合并两个表,R会抛出一个错误。为了纠正这种情况,我们可以传递两个键对变量。即在两个数据集中出现的ID和年份。我们可以使用以下代码合并表1和表2。


df_primary <- tribble(
  ~ID, ~year, ~items,
  "A", 2015,3,
  "A", 2016,7,
  "A", 2017,6,
  "B", 2015,4,
  "B", 2016,8,
  "B", 2017,7,
  "C", 2015,4,
  "C", 2016,6,
  "C", 2017,6)
df_secondary <- tribble(
  ~ID, ~year, ~prices,
  "A", 2015,9,
  "A", 2016,8,
  "A", 2017,12,
  "B", 2015,13,
  "B", 2016,14,
  "B", 2017,6,
  "C", 2015,15,
  "C", 2016,15,
  "C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))

输出结果:


A tibble: 9 x 4
      ID  year items prices
       
 1     A  2015     3      9
 2     A  2016     7      8
 3     A  2017     6     12
 4     B  2015     4     13
 5     B  2016     8     14
 6     B  2017     7      6
 7     C  2015     4     15
 8     C  2016     6     15
 9     C  2017     6     13





公众号

关注公众号,获取一手资讯

“ R语言 数据操作 ” comments 0

评论/回复

电子邮件地址不会被公开。 必填项已用*标注