R语言ETL工程:插入与合并(add/bind)

浏览: 1487

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com

本章要讲的是两个内容,第一个是如何在表格中插入新的数据,包括行和列;第二个是如何把格式相同的表格合并起来,包括行合并和列合并。两者操作和实现内容非常相似,在一定程度上能够相互置换使用,因此放在一章中合并讲解。本章内容较为简单,准备工作如下:

 1library(tidyverse)
2
3## -- Attaching packages --------------------------- tidyverse 1.2.1 --
4
5## √ ggplot2 3.1.0 √ purrr 0.2.5 
6## √ tibble 2.0.1 √ dplyr 0.8.0.1

7## √ tidyr 0.8.1 √ stringr 1.3.1 
8## √ readr 1.3.1 √ forcats 0.3.0

9
10## -- Conflicts ------------------------------ tidyverse_conflicts() --
11## x dplyr::filter() masks stats::filter()
12## x dplyr::lag() masks stats::lag()

入(add)

行插入(add_row)

我们先建立一个数据表:

 1df <- tibble(x = 1:6, y = 6:1)
2df
3
4#
# # A tibble: 6 x 2

5## x y
6## <int> <int>
7## 1 1 6
8## 2 2 5
9## 3 3 4
10## 4 4 3
11## 5 5 2
12## 6 6 1

下面我们插入一行:

 1df %>%
2add_row(x = 7, y = 0)
3
4#
# # A tibble: 7 x 2

5## x y
6## <dbl> <dbl>
7## 1 1 6
8## 2 2 5
9## 3 3 4
10## 4 4 3
11## 5 5 2
12## 6 6 1
13## 7 7 0

插入成功。有的时候我们想要插入到指定的位置,比如我们要把上面的内容插入到第三行,可以这么写:

 1df %>%
2add_row(x = 7, y = 0,.before = 3)
3
4#
# # A tibble: 7 x 2

5## x y
6## <dbl> <dbl>
7## 1 1 6
8## 2 2 5
9## 3 7 0
10## 4 3 4
11## 5 4 3
12## 6 5 2
13## 7 6 1

这样,我们就把需要插入的行插入到第3行。如果想要插入到倒数第3行,可以这样操作:

 1df %>%
2add_row(x = 7, y = 0,.after = 3)
3
4#
# # A tibble: 7 x 2

5## x y
6## <dbl> <dbl>
7## 1 1 6
8## 2 2 5
9## 3 3 4
10## 4 7 0
11## 5 4 3
12## 6 5 2
13## 7 6 1

只要我们插入的x和y的数量一致,我们可以插入任意多的行,不过要清楚每一行都是一一对应的,我们举个例子:

 1df %>%
2add_row(x = 1:3, y = 3:1)
3
4#
# # A tibble: 9 x 2

5## x y
6## <int> <int>
7## 1 1 6
8## 2 2 5
9## 3 3 4
10## 4 4 3
11## 5 5 2
12## 6 6 1
13## 7 1 3
14## 8 2 2
15## 9 3 1

前面我们已经注意到,如果要插入行,就要对每一行所有的元素赋值,如果我们只插入x不插入y,那么其他部分会自动插入缺失值。例如:

 1df %>%
2add_row(x = 1)
3
4#
# # A tibble: 7 x 2

5## x y
6## <dbl> <int>
7## 1 1 6
8## 2 2 5
9## 3 3 4
10## 4 4 3
11## 5 5 2
12## 6 6 1
13## 7 1 NA

列插入(add_column)

 1df %>% 
2add_column(z = 2:7)
3
4#
# # A tibble: 6 x 3

5## x y z
6## <int> <int> <int>
7## 1 1 6 2
8## 2 2 5 3
9## 3 3 4 4
10## 4 4 3 5
11## 5 5 2 6
12## 6 6 1 7

这里必须注意的是,列一定要是一个相同长度的向量才能够插入,否则会报错。不过,如果想要输入一个与表格相同长度的常数向量,可以直接简写为:

 1df %>% 
2add_column(z = 0)
3
4#
# # A tibble: 6 x 3

5## x y z
6## <int> <int> <dbl>
7## 1 1 6 0
8## 2 2 5 0
9## 3 3 4 0
10## 4 4 3 0
11## 5 5 2 0
12## 6 6 1 0
13
14#
等价于

15df %>%
16add_column(z = c(0,0,0,0,0,0)) #只是为了生动一点,熟悉的专家们可以直接用rep(0,6)
17
18#
# # A tibble: 6 x 3

19## x y z
20## <int> <int> <dbl>
21## 1 1 6 0
22## 2 2 5 0
23## 3 3 4 0
24## 4 4 3 0
25## 5 5 2 0
26## 6 6 1 0

并(bind)

行合并(bind_rows)

要让两个表格进行合并,先要条件就是两个表格必须有相同的列数,而且具有相同的列名称,这样才能够对应起来合并成一个表格。我们举个例子:

 1df1 = tibble(a = 1:2, b = 3:4)
2df2 = tibble(a = 7:8, b = 9:10)
3
4df1
5
6#
# # A tibble: 2 x 2

7## a b
8## <int> <int>
9## 1 1 3
10## 2 2 4
11
12df2
13
14#
# # A tibble: 2 x 2

15## a b
16## <int> <int>
17## 1 7 9
18## 2 8 10

下面我们完成合并:

 1df1 %>%
2bind_rows(df2)
3
4#
# # A tibble: 4 x 2

5## a b
6## <int> <int>
7## 1 1 3
8## 2 2 4
9## 3 7 9
10## 4 8 10

列合并(bind_cols)

两个表格的合并条件会宽松一点,那就是只要表格的行数相等即可,例子如下:

1df1 %>%
2bind_cols(df2)
3
4#
# # A tibble: 2 x 4

5## a b a1 b1
6## <int> <int> <int> <int>
7## 1 1 3 7 9
8## 2 2 4 8 10

这里我们发现了一个有趣的现象,因为我们列名称是完全相同的,所以第二个表格的列名称会补上一个“1”。正常情况下,我们不希望合并到一个表格的列名称会发生重名现象,这是大家在实际工作中需要注意的。

本章我们介绍了如何插入行列,以及对表格进行行列合并,这些是表格操纵最基本的操作,需要牢牢把握。


——————————————

往期精彩:

天善智能每日一道算法题,打卡学习小程序

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册