ITPub博客

首页 > > > R语言ETL工程系列:检索(select)

R语言ETL工程系列:检索(select)

作者:浪花小雨滴 时间:2018-12-26 18:01:09 0 删除 编辑

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

本章介绍如何从表中检索一个或多个数据列,首先我们加载需要使用的包。其中我们需要的航班数据flights数据集需要在nycflights13中加载。

library(tidyverse)
library(nycflights13)

select函数

select是最常用的ETL函数之一,用途就是从表格中选取需要的列。
要使用这个函数,要搞清楚两个问题:1.从哪里获取数据?2.从数据里面提取什么?所以需要给出至少两个信息:1.表格名称;2.列名称。

检索单个列

我们从最简单的语句开始:

flights %>%
select(year)

## # A tibble: 336,776 x 1
## year
## <int>
## 1 2013
## 2 2013
## 3 2013
## 4 2013
## 5 2013
## 6 2013
## 7 2013
## 8 2013
## 9 2013
## 10 2013
## # ... with 336,766 more rows

上面的语句表示:从flights表格中提取了名为year的列。相应的SQL语句如下:

<SQL> SELECT `year`
FROM `flights`

提示:尽管SQL不区分大小写,但是统一使用大写来写SQL语句有利于提高可读性。另外,很多SQL语句要求最后要加分号(;),否则会报错。

检索多个列

检索多个列与检索单列相似,需要给出多个列名称,而且列名称之间需要用逗号(,)隔开。需要注意的是,最后的列名称后面不能加逗号,否则会报错。

flights %>%
select(year,month,day)

## # A tibble: 336,776 x 3
## year month day
## <int> <int> <int>
## 1 2013 1 1
## 2 2013 1 1
## 3 2013 1 1
## 4 2013 1 1
## 5 2013 1 1
## 6 2013 1 1
## 7 2013 1 1
## 8 2013 1 1
## 9 2013 1 1
## 10 2013 1 1
## # ... with 336,766 more rows

相应SQL语句如下:

<SQL> SELECT `year`, `month`, `day`
FROM `flights`

检索所有列

R中只要输入表格名称,默认就是包含了表格所有列,因此提取所有列非常简单:

flights

## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time
## <int> <int> <int> <int> <int> <dbl> <int>
## 1 2013 1 1 517 515 2 830
## 2 2013 1 1 533 529 4 850
## 3 2013 1 1 542 540 2 923
## 4 2013 1 1 544 545 -1 1004
## 5 2013 1 1 554 600 -6 812
## 6 2013 1 1 554 558 -4 740
## 7 2013 1 1 555 600 -5 913
## 8 2013 1 1 557 600 -3 709
## 9 2013 1 1 557 600 -3 838
## 10 2013 1 1 558 600 -2 753
## # ... with 336,766 more rows, and 12 more variables: sched_arr_time <int>,
## # arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## # minute <dbl>, time_hour <dttm>

SQL代码:

<SQL> SELECT *
FROM `flights`

根据列名称对列进行检索

有的时候我们的表格具有很多列,而列名称是具有一定的命名规则的,我们可以根据这些规则来选择特定的列。比如在flights表格中,我们先看一下flights有哪些列名称:

flights %>% names()

## [1] "year" "month" "day" "dep_time"
## [5] "sched_dep_time" "dep_delay" "arr_time" "sched_arr_time"
## [9] "arr_delay" "carrier" "flight" "tailnum"
## [13] "origin" "dest" "air_time" "distance"
## [17] "hour" "minute" "time_hour"

这样我们就知道flights都有哪些列,现在我们想要检索以“time”结尾的列,可以这样操作:

flights %>%
select(ends_with("time"))

## # A tibble: 336,776 x 5
## dep_time sched_dep_time arr_time sched_arr_time air_time
## <int> <int> <int> <int> <dbl>
## 1 517 515 830 819 227
## 2 533 529 850 830 227
## 3 542 540 923 850 160
## 4 544 545 1004 1022 183
## 5 554 600 812 837 116
## 6 554 558 740 728 150
## 7 555 600 913 854 158
## 8 557 600 709 723 53
## 9 557 600 838 846 140
## 10 558 600 753 745 138
## # ... with 336,766 more rows

这样一来我们就选择了所有与时间相关的变量。如果要选择以一定的字符串起始的列,可以使用starts_with,比如:

flights %>%
select(starts_with("dep"))

## # A tibble: 336,776 x 2
## dep_time dep_delay
## <int> <dbl>
## 1 517 2
## 2 533 4
## 3 542 2
## 4 544 -1
## 5 554 -6
## 6 554 -4
## 7 555 -5
## 8 557 -3
## 9 557 -3
## 10 558 -2
## # ... with 336,766 more rows

关于选择列的条件还有很多,它们是tidyselect包中的函数,比如contains可以选择列名称中包含某一特定字符串的列,详情可以用?vars_select来查询你需要的功能。

检索独特的值

有时候我们只想知道出现的值的不同种类,不需要每次出现都表示出来,这个时候我们可以使用distinct函数,下面我们举个例子。
我们想要知道数据中包含了哪些月份的数据,但是单纯选择月份这一字段是做不到的。

flights %>%
select(month)

## # A tibble: 336,776 x 1
## month
## <int>
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 1
## 8 1
## 9 1
## 10 1
## # ... with 336,766 more rows

我们需要使用distinct函数,让month列中重复出现的值不会第二次出现:

flights %>%
select(month) %>%
distinct()

## # A tibble: 12 x 1
## month
## <int>
## 1 1
## 2 10
## 3 11
## 4 12
## 5 2
## 6 3
## 7 4
## 8 5
## 9 6
## 10 7
## 11 8
## 12 9

SQL代码:

<SQL> SELECT DISTINCT *
FROM (SELECT `month`
FROM `flights`)

只显示若干行

前面的例子中其实我们也可以知道,flights这个数据表一共有336,776行,也就是说,我们无法在屏幕中就浏览全数据,我们只能截取一部分查看。
比较常见的方法,是查看前几行,或者最后几行。但是事实上,只要我们可以根据需要查看任意行(使用切片函数slice)。

查看前6行:

flights %>%
head()

## # A tibble: 6 x 19
## year month day dep_time sched_dep_time dep_delay arr_time
## <int> <int> <int> <int> <int> <dbl> <int>
## 1 2013 1 1 517 515 2 830
## 2 2013 1 1 533 529 4 850
## 3 2013 1 1 542 540 2 923
## 4 2013 1 1 544 545 -1 1004
## 5 2013 1 1 554 600 -6 812
## 6 2013 1 1 554 558 -4 740
## # ... with 12 more variables: sched_arr_time <int>, arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## # time_hour <dttm>

查看后6行:

flights %>%
tail()

## # A tibble: 6 x 19
## year month day dep_time sched_dep_time dep_delay arr_time
## <int> <int> <int> <int> <int> <dbl> <int>
## 1 2013 9 30 NA 1842 NA NA
## 2 2013 9 30 NA 1455 NA NA
## 3 2013 9 30 NA 2200 NA NA
## 4 2013 9 30 NA 1210 NA NA
## 5 2013 9 30 NA 1159 NA NA
## 6 2013 9 30 NA 840 NA NA
## # ... with 12 more variables: sched_arr_time <int>, arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## # time_hour <dttm>

查看第100行到第103行:

flights %>%
slice(100:103)

## # A tibble: 4 x 19
## year month day dep_time sched_dep_time dep_delay arr_time
## <int> <int> <int> <int> <int> <dbl> <int>
## 1 2013 1 1 752 759 -7 955
## 2 2013 1 1 753 755 -2 1056
## 3 2013 1 1 754 759 -5 1039
## 4 2013 1 1 754 755 -1 1103
## # ... with 12 more variables: sched_arr_time <int>, arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
## # time_hour <dttm>

这里只展示取前6行的代码的SQL代码:

<SQL> SELECT *
FROM `flights`
LIMIT 6

使用注释

任何编程语言都需要有注释,注释能够方便别人读懂你的代码。即使你不打算把代码分享给别人,注释也有助于自己在往后的工作中,重新使用自己已经写过的代码。
R语言中,注释一般采用井号(#),即#后面的内容就是需要注释的部分,我们举个例子。

flights %>% #这是我们的表格名称flights
select(year) #这是我们要取的列year

## # A tibble: 336,776 x 1
## year
## <int>
## 1 2013
## 2 2013
## 3 2013
## 4 2013
## 5 2013
## 6 2013
## 7 2013
## 8 2013
## 9 2013
## 10 2013
## # ... with 336,766 more rows

#上面的井号后面的都是注释,不会被执行

提示:尽管本系列的重点不是SQL,但是这里还是提及一下SQL中的注释格式。SQL中,与R语言井号(#)对等的注释代码是“–”(两个减号,又称连字符)。例子如下:

<SQL> SELECT DISTINCT *
FROM (SELECT `month` --不用执行我,我只是注释
FROM `flights`)

小结

本章主要内容就是,如何选择列:选择一列,选择多列,选择列中独特的值,只显示其中的若干行。最后,我们还介绍了如何在R语言中对代码进行注释,加强代码的可读性,从而提高代码的重复利用性。老实说,这些内容都比较简单,不过被使用频次是最多的,必须要牢牢掌握,随时使用。

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

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

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39850