R语言 数据框连接
在R语言中,数据框是通用的数据对象,用于存储表格数据。数据框被认为是R编程中最流行的数据对象,因为以表格的形式分析数据会更舒服。数据框架也可以被教导为床垫,矩阵的每一列都可以是不同的数据类型。数据框架是由三个主要部分组成的,即数据、行和列。在R语言中,我们使用 merge() 函数来合并两个数据框架。这个函数存在于 dplyr 包的 join() 函数中。合并两个数据框架最重要的条件是列的类型应该是相同的,在此基础上进行合并。 merge() 函数的工作原理类似于DBMS中的join。R中可用的合并类型有。
- 自然连接或内部连接
- 左外联接
- 右外联接
- 全外联接
- 交叉连接
- 半联接
- 反联接
R中 merge() 函数的基本语法。
语法: merge(df1, df2, by.df1, by.df2, all.df1, all . df2, sort = TRUE)
参数:
df1: 一个数据框架
df2: 另一个数据框架
by.df1, by.df2: df1和df2共有的列的名称。
现在让我们试着逐一了解所有的合并类型。首先,我们将创建两个数据框,这将有助于我们轻松地理解每个连接。
# 数据框1
df1 = data.frame(StudentId = c(101:106),
Product = c("Hindi", "English",
"Maths", "Science",
"Political Science",
"Physics"))
df1
输出
StudentId Product
1 101 Hindi
2 102 English
3 103 Maths
4 104 Science
5 105 Political Science
6 106 Physics
# 数据框2
df2 = data.frame(StudentId = c(102, 104, 106,
107, 108),
State = c("Mangalore", "Mysore",
"Pune", "Dehradun", "Delhi"))
df2
输出
StudentId State
1 102 Mangalore
2 104 Mysore
3 106 Pune
4 107 Dehradun
5 108 Delhi
自然连接或内部连接
内联接是用来只保留那些从数据框架中匹配的行,在这里,我们实际上指定了参数 all = FALSE。 如果我们尝试用集合理论来理解这一点,那么我们可以说这里我们实际上是在进行交集操作。比如说。
A = [1, 2, 3, 4, 5]
B = [2, 3, 5, 6]
Then the output of natural join will be (2, 3, 5)
这是R语言中最简单和最常见的连接类型。现在让我们试着用R语言程序来理解它。
例子
# R program to illustrate
# Joining of dataframes
df = merge(x = df1, y = df2, by = "StudentId")
df
输出
StudentId Product State
1 102 English Mangalore
2 104 Science Mysore
3 106 Physics Pune
左外联接
左外联接基本上是包括你的数据框架x中的所有行和y中的那些匹配的行,在这里,我们实际上指定参数 x = TRUE。 如果我们尝试用基本的集合理论来理解这一点,那么我们可以说在这里我们实际上是在显示完整的集合x。现在让我们尝试用R程序来理解这个。
例子
# R program to illustrate
# Joining of dataframes
df = merge(x = df1, y = df2, by = "StudentId",
all.x = TRUE)
df
输出
StudentId Product State
1 101 Hindi NA
2 102 English Mangalore
3 103 Maths NA
4 104 Science Mysore
5 105 Political Science NA
6 106 Physics Pune
右外联接
右外联接基本上是包括你的数据框架y中的所有行,并且只包括x中那些匹配的行,在这里,我们实际上指定了参数 y = TRUE。 如果我们尝试用基本的集合理论来理解这一点,那么我们可以说在这里我们实际上是在显示一个完整的集合y。现在让我们尝试用R程序来理解这一点:
例子
# R program to illustrate
# Joining of dataframes
df = merge(x = df1, y = df2, by = "StudentId",
all.y = TRUE)
df
输出
StudentId Product State
1 102 English Mangalore
2 104 Science Mysore
3 106 Physics Pune
4 107 NA Dehradun
5 108 NA Delhi
完全外联
外联基本上是用来保留两个数据框架的所有记录,在这里,我们实际上指定了参数 all = TRUE。 如果我们尝试用基本的集合理论来理解这一点,那么我们可以说这里我们实际上是在执行联合选项。现在让我们试着用R程序来理解这个问题。
例子
# R program to illustrate
# Joining of dataframes
df = merge(x = df1, y = df2, by = "StudentId",
all = TRUE)
df
输出
StudentId Product State
1 101 Hindi NA
2 102 English Mangalore
3 103 Maths NA
4 104 Science Mysore
5 105 Political Science NA
6 106 Physics Pune
7 107 NA Dehradun
8 108 NA Delhi
交叉连接
交叉连接也被称为笛卡尔连接,其结果是一个数据框架的每一行都被连接到另一个数据框架的每一行。在集合理论中,这种类型的连接被称为两个集合之间的笛卡尔积。现在让我们试着用R程序来理解这一点。
例子
# R program to illustrate
# Joining of dataframes
df = merge(x = df1, y = df2, by = NULL)
df
输出
StudentId.x Product StudentId.y State
1 101 Hindi 102 Mangalore
2 102 English 102 Mangalore
3 103 Maths 102 Mangalore
4 104 Science 102 Mangalore
5 105 Political Science 102 Mangalore
6 106 Physics 102 Mangalore
7 101 Hindi 104 Mysore
8 102 English 104 Mysore
9 103 Maths 104 Mysore
10 104 Science 104 Mysore
11 105 Political Science 104 Mysore
12 106 Physics 104 Mysore
13 101 Hindi 106 Pune
14 102 English 106 Pune
15 103 Maths 106 Pune
16 104 Science 106 Pune
17 105 Political Science 106 Pune
18 106 Physics 106 Pune
19 101 Hindi 107 Dehradun
20 102 English 107 Dehradun
21 103 Maths 107 Dehradun
22 104 Science 107 Dehradun
23 105 Political Science 107 Dehradun
24 106 Physics 107 Dehradun
25 101 Hindi 108 Delhi
26 102 English 108 Delhi
27 103 Maths 108 Delhi
28 104 Science 108 Delhi
29 105 Political Science 108 Delhi
30 106 Physics 108 Delhi
半连接
这种连接有点像内部连接,只有左边的数据框架列和值被选中。现在让我们试着用R程序来理解这个。
例子
# R program to illustrate
# Joining of dataframes
# Import required library
library(dplyr)
df = df1 %>% semi_join(df2, by = "StudentId")
df
输出
StudentId Product
1 102 English
2 104 Science
3 106 Physics
反联接
在集合理论方面,我们可以把反连接说成是集合的差异操作,例如,A = (1, 2, 3, 4) B = (2, 3, 5) 那么A-B的输出将是集合(1, 4)。这个连接有点像df1-df2,因为它基本上是从df1中选择所有实际上不存在于df2中的行。现在让我们试着用R程序来理解这个问题。
例子
# R program to illustrate
# Joining of dataframes
# Import required library
library(dplyr)
df = df1 %>% anti_join(df2, by = "StudentId")
df
输出
StudentId Product
1 101 Hindi
2 103 Maths
3 105 Political Science