ITPub博客

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

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

作者:浪花小雨滴 时间:2019-03-01 21:06:57 0 删除 编辑

作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在业界的应用。邮箱:huang.tian-yuan@qq.com.欢迎合作交流

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

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()

插入(add)

行插入(add_row)

我们先建立一个数据表:

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

列插入(add_column)

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

合并(bind)

行合并(bind_rows)

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

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

列合并(bind_cols)

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

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”。正常情况下,我们不希望合并到一个表格的列名称会发生重名现象,这是大家在实际工作中需要注意的。

小结

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

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39870