不用SQL，也可以实现数据集的合并和连接

1 数据合并

1.1 cbind列合并（等长）

1.2 rbind行合并

2 数据连接/匹配

2.1 内连接

2.2 外连接

2.3 左连接

2.4 右连接

2.5 双（多）字段内连接

3 数据增减

1 数据合并

1.1 cbind列合并（等长）

```#等长
#生成测试数据
> ID1 <- c(1:4)
> ID2 <- c(2:5)
> name<-c("A","B","C","D")
> score<-c(8,22,7,6)
> student1<-data.frame(ID1,name)
> student2<-data.frame(ID2,score)

> student1
ID1 name
1   1    A
2   2    B
3   3    C
4   4    D
> student2
ID2 score
1   2     8
2   3    22
3   4     7
4   5     6
> cbind(student1,student2) #按照行合并student1和student2
ID1 name ID2 score
1   1    A   2     8
2   2    B   3    22
3   3    C   4     7
4   4    D   5     6```

1.2 rbind行合并

```> #生成测试数据student1
> ID <- c(1:4)
> score <- c(8,22,7,33)
> student1<-data.frame(ID,score)
> #生成测试数据student2
> ID <- c("A","B","C","D")
> score <- c(11,2,55,3)
> student2<-data.frame(ID,score)

> student1
ID score
1  1     8
2  2    22
3  3     7
4  4    33
> student2
ID score
1  A    11
2  B     2
3  C    55
4  D     3
> rbind(student1,student2) #按行合并，需要注意数据集需要有相同的列字段名
ID score
1  1     8
2  2    22
3  3     7
4  4    33
5  A    11
6  B     2
7  C    55
8  D     3```

2 数据连接/匹配

merge函数语法

```merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
incomparables = NULL, ...)```

dplyr包中的inner_join、left_join、right_join、full_join语法

```inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)```

```> #生成数据集1
> ID<-c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,name)
> #生成数据集1
> ID<-c(1,2,5)
> score<-c(89,22,78)
> student2<-data.frame(ID,score)
> student1
ID name
1  1  Jim
2  2 Tony
3  3 Lisa
> student2
ID score
1  1    89
2  2    22
3  5    78```

2.1 内连接（指定字段匹配输出）

```> #内连接
> merge(student1,student2,by="ID",all=FALSE)
ID name score
1  1  Jim    89
2  2 Tony    22
> dplyr::inner_join(student1,student2,by="ID")
ID name score
1  1  Jim    89
2  2 Tony    22```

2.2 外连接

```> #外连接
> merge(student1,student2,by="ID",all=TRUE)
ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
4  5 <NA>    78
> dplyr::full_join(student1,student2,by="ID")
ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
4  5 <NA>    78```

2.3 左连接

```> #左连接
> merge(student1,student2,by="ID",all.x=TRUE)
ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
> dplyr::left_join(student1,student2,by="ID")
ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA```

2.4 右连接

```> #右连接
> merge(student1,student2,by="ID",all.y=TRUE)
ID name score
1  1  Jim    89
2  2 Tony    22
3  5 <NA>    78
> dplyr::right_join(student1,student2,by="ID")
ID name score
1  1  Jim    89
2  2 Tony    22
3  5 <NA>    78```

2.5 双（多）字段内连接

```> #生成数据集1
> ID<-c(1,2,3)
> SD <- c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,SD,name)
> #生成数据集1
> ID<-c(1,2,5)
> SD <- c(5,2,3)
> score<-c(89,22,78)
> student2<-data.frame(ID,SD,score)
> student1
ID SD name
1  1  1  Jim
2  2  2 Tony
3  3  3 Lisa
> student2
ID SD score
1  1  5    89
2  2  2    22
3  5  3    78
>
> #多字段内连接
> merge(student1,student2,by=c("ID","SD"),all=FALSE)
ID SD name score
1  2  2 Tony    22
> dplyr::inner_join(student1,student2,by=c("ID","SD"))
ID SD name score
1  2  2 Tony    22```

3 数据增减

```#方法一：减行数或列数
x=x[,-1] #代表删除x数据集中第一列数据

#方法二：dplyr::mutate
#数值重定义和赋值
#将Ozone列取负数赋值给new，然后Temp列重新计算为(Temp - 32) / 1.8
mutate(airquality, new = -Ozone, Temp = (Temp - 32) / 1.8)

#方法三：subset筛选变量服从某值的子集
subset(airquality, Temp > 80, select = c(Ozone, Temp))

#方法四：rbind和cbind```

0 条评论

• 数据结构|冒泡排序与选择排序

排序算法可以说是算法中使用的比较频繁的，冒泡排序是一种简单的排序，它通过遍历，一次比较两个元素，如果排序错误就交换位置，遍历需要重复进行直到不再需要交换，才算排...

• Python涨知识|你懂is和==的神奇区别吗

在编程中我们经常会用到“is”和“==”来表示判断，那么我想问大家一个问题为什么python会出现两个“表面”意思相近的语句呢？

• Python|函数list和set

最近看到一个比较有意思的代码如下，可以看到当我们使用花括号对a里的每个值进行加一时，输出的却是花括号，当我们使用中括号时输出的就是中括号，这到底是什么呢？

• socket服务部署到服务端后启动失败Cannot assign requested address: bind 的总结

https://blog.csdn.net/asd1098626303/article/details/79141315

• 前端网页制作秘密武器之盒模型边框

盒模型是CSS的一种基础设计模式，定义了Web页面中的元素是如何被看作盒子来解析的，而每一个盒子又有不同的展示方法接下来我们将详细的介绍一下边框的高级属性：圆角...

• 开发|Springboot文件上传与下载

我们在做项目的时候很多时候会涉及到操作文件的步骤，今天我们就来讲讲如何实现Springboot文件上传与下载。

• ARkit|一起“宜家”吧！！！

宜家家居将该技术应用到智能家居中，通过“IKEA Place”实现在住所就能看到虚拟家居在家中摆放的实际情况。

• java练习本(2019-07-13)

“ The most I can do for my friend is simply to be his friend. I have no wealth t...

• 数据结构|字符串匹配

python字符串str是在Python编写程序过程中，最常见的一种基本数据类型。字符串是许多单个子串组成的序列，其主要是用来表示文本。字符串是不可变数据类型，...

• 使用Spring Boot Gradle 打war包的一点心得体会

最近实验室的一些项目采用了Spring Boot架构进行开发。项目完成以后，就需要部署到服务器。常规办法就是将项目打成war包，直接拖到tomcat的webaa...