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

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

前言

本章介绍如何从表中检索一个或多个数据列。

首先我们加载需要使用的包。其中我们需要的航班数据flights数据集需要在nycflights13中加载:

1library(tidyverse)2library(nycflights13)

select函数

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

检索单个列

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

1flights %>%2  select(year)
 1## # A tibble: 336,776 x 1 2##     year 3##    <int> 4##  1  2013 5##  2  2013 6##  3  2013 7##  4  2013 8##  5  2013 9##  6  201310##  7  201311##  8  201312##  9  201313## 10  201314## # ... with 336,766 more rows

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

1<SQL> SELECT `year`2FROM `flights`

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

检索多个列

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

1flights %>%2  select(year,month,day)
 1## # A tibble: 336,776 x 3 2##     year month   day 3##    <int> <int> <int> 4##  1  2013     1     1 5##  2  2013     1     1 6##  3  2013     1     1 7##  4  2013     1     1 8##  5  2013     1     1 9##  6  2013     1     110##  7  2013     1     111##  8  2013     1     112##  9  2013     1     113## 10  2013     1     114## # ... with 336,766 more rows

相应SQL语句如下:

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

检索所有列

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

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

SQL代码:

1<SQL> SELECT *2FROM `flights`

根据列名称对列进行检索

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

1flights %>% names()
1##  [1] "year"           "month"          "day"            "dep_time"      2##  [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"3##  [9] "arr_delay"      "carrier"        "flight"         "tailnum"       4## [13] "origin"         "dest"           "air_time"       "distance"      5## [17] "hour"           "minute"         "time_hour"

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

1flights %>%2  select(ends_with("time"))
 1## # A tibble: 336,776 x 5 2##    dep_time sched_dep_time arr_time sched_arr_time air_time 3##       <int>          <int>    <int>          <int>    <dbl> 4##  1      517            515      830            819      227 5##  2      533            529      850            830      227 6##  3      542            540      923            850      160 7##  4      544            545     1004           1022      183 8##  5      554            600      812            837      116 9##  6      554            558      740            728      15010##  7      555            600      913            854      15811##  8      557            600      709            723       5312##  9      557            600      838            846      14013## 10      558            600      753            745      13814## # ... with 336,766 more rows

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

1flights %>%2  select(starts_with("dep"))
 1## # A tibble: 336,776 x 2 2##    dep_time dep_delay 3##       <int>     <dbl> 4##  1      517         2 5##  2      533         4 6##  3      542         2 7##  4      544        -1 8##  5      554        -6 9##  6      554        -410##  7      555        -511##  8      557        -312##  9      557        -313## 10      558        -214## # ... with 336,766 more rows

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

检索独特的值

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

1flights %>%2  select(month)
 1## # A tibble: 336,776 x 1 2##    month 3##    <int> 4##  1     1 5##  2     1 6##  3     1 7##  4     1 8##  5     1 9##  6     110##  7     111##  8     112##  9     113## 10     114## # ... with 336,766 more rows

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

1flights %>%2  select(month) %>%3  distinct()
 1## # A tibble: 12 x 1 2##    month 3##    <int> 4##  1     1 5##  2    10 6##  3    11 7##  4    12 8##  5     2 9##  6     310##  7     411##  8     512##  9     613## 10     714## 11     815## 12     9

SQL代码:

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

只显示若干行

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

查看前6行:

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

查看后6行:

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

查看第100行到第103行:

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

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

1<SQL> SELECT *2FROM `flights`3LIMIT 6

使用注释

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

1flights %>%      #这是我们的表格名称flights2  select(year)   #这是我们要取的列year
 1## # A tibble: 336,776 x 1 2##     year 3##    <int> 4##  1  2013 5##  2  2013 6##  3  2013 7##  4  2013 8##  5  2013 9##  6  201310##  7  201311##  8  201312##  9  201313## 10  201314## # ... with 336,766 more rows

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

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

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

小结

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

往期精彩:

  1. R语言ETL工程系列:总论

  2. R语言ETL工程系列:R语言基础设置

  3. R语言ETL工程系列:读写(read/write)

  4. R语言文本特征工程:词袋模型

公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

R语言ETL工程系列:检索(select)相关推荐

  1. R语言ETL工程系列:排序(arrange)

    作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 前言 上篇介 ...

  2. R语言ETL工程:创建字段(mutate)

    作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用.邮箱:huang.tian-yuan@qq.com.欢迎合作交流 有没有一些时候你想要给表格加一个新的列?本章将会介 ...

  3. R语言数据挖掘实战系列(4)

    R语言数据挖掘实战系列(4)--数据预处理 数据预处理一方面是要提高数据的质量,另一方面是要让数据更好地适应特定的挖掘技术或工具.数据预处理的主要内容包括数据清洗.数据集成.数据变换和数据规约. 一. ...

  4. 十八、R语言特征工程实战

    特征工程是机器学习过程中和模型训练同样重要的部分,特征如何提取.如何处理.如何选择.如何使用都是特征工程的范畴,特征工程需要具备数据分析的能力,那些称为数据科学家的人一定是有很强的特征工程能力的人.R ...

  5. R语言ETL系列:汇总(summarise)

    作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 本章讲解如何 ...

  6. left join 不重复_R语言ETL工程:连接(join)

    作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 本章将会介绍 ...

  7. rstudio python_【干货分享】R语言与数据分析系列之R与Rstudio的安装

    第一章 R基础 一.什么是R 1.编程:面向对象的编程语言 2.使用者:有着统计分析功能及强大作图功能的软件 3.开发者:一组开源的数据操作 二.R的优点 免费.跨平台.简单易学.程序小巧.易扩展. ...

  8. R语言应用实战系列(五)-朴素贝叶斯算法以及ROC和PR曲线

    前言 朴素贝叶斯(Naviebayes)的原理很简单:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为该代分项属于哪个类别? 以下是我为大家准备的几个精品专栏,喜欢的小伙 ...

  9. R语言应用实战系列(三)-智能推荐模型的构建

    一.基本概念和原理 智能推荐的方法有很多,包括基于内容推荐,协同过滤推荐,基于关联规则,基于知识推荐,基于效用推荐和组合推荐. 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我 ...

  10. R语言应用实战系列(二)-基于R语言的方差分析

    前言 回归分析重点考察变量间的相关关系或因果关系,当包含因子是解释变量时,关注点通常是从变量间的关系转向组与组之间的差异分析,这种分析样本组之间的区别的方法称为方差分析(Analysis of Var ...

最新文章

  1. mysql begin end 批量更新_MySql中4种批量更新的方法
  2. python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库
  3. [置顶] 删除:大数据取舍之道读书笔记
  4. 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
  5. 【Flink】FLink 如果watermark水印时间超出今天会是什么问题呢
  6. python + selenium - selenium常用元素定位
  7. 墨刀 vs Axure RP
  8. android列表的默认值,ListPreference默认值没有显示
  9. 你都用python来做什么-你都用 Python 来做什么?
  10. Rust 1.7.0 匹配器 match 的简单介绍和使用
  11. 西门子smart200 圆弧插补 整合画图程序 2轴3轴
  12. 【GlobalMapper精品教程】002:GlobalMapper中文版安装后的基本设置
  13. Java 二叉树的层序遍历
  14. 机器学习(时间序列):线性回归之虚拟变量 dummy variables
  15. MFC基于对话框使用dll进行多语言切换
  16. SpringBoot物流管理项目,拿去学习吧(源码)
  17. 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】
  18. ZJCTF-Triple Language Write up
  19. 餐饮门店每日业务情况数据分析仪表盘(外卖平台)
  20. 从联想昭阳到MacBook Pro,致我的那些败家玩意—

热门文章

  1. loadrunner录制脚本为空的情况
  2. 我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!...
  3. 别再用 Visio 了!试试这个比它快 10 倍的画图工具不香吗?
  4. 牛逼!在IDEA里搞Spring Boot Mybatis反向工程,太爽咯~
  5. 作为面试官,我是怎么快速判断程序员能力的?
  6. python三次方函数_python函数基础------第三次作业讲解(二)
  7. python基础之centos7源码安装python3
  8. KEYCODE_DPAD_CENTER 和 KEYCODE_ENTER
  9. 02--Activiti初始化表
  10. 使用jQuery快速高效制作网页交互特效(1)