首页 > > > R语言ETL工程:插入与合并(add/bind)
本章要讲的是两个内容,第一个是如何在表格中插入新的数据,包括行和列;第二个是如何把格式相同的表格合并起来,包括行合并和列合并。两者操作和实现内容非常相似,在一定程度上能够相互置换使用,因此放在一章中合并讲解。本章内容较为简单,准备工作如下:
library(tidyverse)
## -- Attaching packages --------------------------- tidyverse 1.2.1 --
## √ ggplot2 3.1.0 √ purrr 0.2.5
## √ tibble 2.0.1 √ dplyr 0.8.0.1
## √ tidyr 0.8.1 √ stringr 1.3.1
## √ readr 1.3.1 √ forcats 0.3.0
## -- Conflicts ------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
我们先建立一个数据表:
df <- tibble(x = 1:6, y = 6:1)
df
## # A tibble: 6 x 2
## x y
## <int> <int>
## 1 1 6
## 2 2 5
## 3 3 4
## 4 4 3
## 5 5 2
## 6 6 1
下面我们插入一行:
df %>%
add_row(x = 7, y = 0)
## # A tibble: 7 x 2
## x y
## <dbl> <dbl>
## 1 1 6
## 2 2 5
## 3 3 4
## 4 4 3
## 5 5 2
## 6 6 1
## 7 7 0
插入成功。有的时候我们想要插入到指定的位置,比如我们要把上面的内容插入到第三行,可以这么写:
df %>%
add_row(x = 7, y = 0,.before = 3)
## # A tibble: 7 x 2
## x y
## <dbl> <dbl>
## 1 1 6
## 2 2 5
## 3 7 0
## 4 3 4
## 5 4 3
## 6 5 2
## 7 6 1
这样,我们就把需要插入的行插入到第3行。如果想要插入到倒数第3行,可以这样操作:
df %>%
add_row(x = 7, y = 0,.after = 3)
## # A tibble: 7 x 2
## x y
## <dbl> <dbl>
## 1 1 6
## 2 2 5
## 3 3 4
## 4 7 0
## 5 4 3
## 6 5 2
## 7 6 1
只要我们插入的x和y的数量一致,我们可以插入任意多的行,不过要清楚每一行都是一一对应的,我们举个例子:
df %>%
add_row(x = 1:3, y = 3:1)
## # A tibble: 9 x 2
## x y
## <int> <int>
## 1 1 6
## 2 2 5
## 3 3 4
## 4 4 3
## 5 5 2
## 6 6 1
## 7 1 3
## 8 2 2
## 9 3 1
前面我们已经注意到,如果要插入行,就要对每一行所有的元素赋值,如果我们只插入x不插入y,那么其他部分会自动插入缺失值。例如:
df %>%
add_row(x = 1)
## # A tibble: 7 x 2
## x y
## <dbl> <int>
## 1 1 6
## 2 2 5
## 3 3 4
## 4 4 3
## 5 5 2
## 6 6 1
## 7 1 NA
df %>%
add_column(z = 2:7)
## # A tibble: 6 x 3
## x y z
## <int> <int> <int>
## 1 1 6 2
## 2 2 5 3
## 3 3 4 4
## 4 4 3 5
## 5 5 2 6
## 6 6 1 7
这里必须注意的是,列一定要是一个相同长度的向量才能够插入,否则会报错。不过,如果想要输入一个与表格相同长度的常数向量,可以直接简写为:
df %>%
add_column(z = 0)
## # A tibble: 6 x 3
## x y z
## <int> <int> <dbl>
## 1 1 6 0
## 2 2 5 0
## 3 3 4 0
## 4 4 3 0
## 5 5 2 0
## 6 6 1 0
#等价于
df %>%
add_column(z = c(0,0,0,0,0,0)) #只是为了生动一点,熟悉的专家们可以直接用rep(0,6)
## # A tibble: 6 x 3
## x y z
## <int> <int> <dbl>
## 1 1 6 0
## 2 2 5 0
## 3 3 4 0
## 4 4 3 0
## 5 5 2 0
## 6 6 1 0
要让两个表格进行合并,先要条件就是两个表格必须有相同的列数,而且具有相同的列名称,这样才能够对应起来合并成一个表格。我们举个例子:
df1 = tibble(a = 1:2, b = 3:4)
df2 = tibble(a = 7:8, b = 9:10)
df1
## # A tibble: 2 x 2
## a b
## <int> <int>
## 1 1 3
## 2 2 4
df2
## # A tibble: 2 x 2
## a b
## <int> <int>
## 1 7 9
## 2 8 10
下面我们完成合并:
df1 %>%
bind_rows(df2)
## # A tibble: 4 x 2
## a b
## <int> <int>
## 1 1 3
## 2 2 4
## 3 7 9
## 4 8 10
两个表格的合并条件会宽松一点,那就是只要表格的行数相等即可,例子如下:
df1 %>%
bind_cols(df2)
## # A tibble: 2 x 4
## a b a1 b1
## <int> <int> <int> <int>
## 1 1 3 7 9
## 2 2 4 8 10
这里我们发现了一个有趣的现象,因为我们列名称是完全相同的,所以第二个表格的列名称会补上一个“1”。正常情况下,我们不希望合并到一个表格的列名称会发生重名现象,这是大家在实际工作中需要注意的。
本章我们介绍了如何插入行列,以及对表格进行行列合并,这些是表格操纵最基本的操作,需要牢牢把握。
原文作者:;如有侵权,请联系管理员删除。