R语言ETL工程系列:检索(select)
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深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语言中对代码进行注释,加强代码的可读性,从而提高代码的重复利用性。老实说,这些内容都比较简单,不过被使用频次是最多的,必须要牢牢掌握,随时使用。
往期精彩:
R语言ETL工程系列:总论
R语言ETL工程系列:R语言基础设置
R语言ETL工程系列:读写(read/write)
R语言文本特征工程:词袋模型
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
R语言ETL工程系列:检索(select)相关推荐
- R语言ETL工程系列:排序(arrange)
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 前言 上篇介 ...
- R语言ETL工程:创建字段(mutate)
作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用.邮箱:huang.tian-yuan@qq.com.欢迎合作交流 有没有一些时候你想要给表格加一个新的列?本章将会介 ...
- R语言数据挖掘实战系列(4)
R语言数据挖掘实战系列(4)--数据预处理 数据预处理一方面是要提高数据的质量,另一方面是要让数据更好地适应特定的挖掘技术或工具.数据预处理的主要内容包括数据清洗.数据集成.数据变换和数据规约. 一. ...
- 十八、R语言特征工程实战
特征工程是机器学习过程中和模型训练同样重要的部分,特征如何提取.如何处理.如何选择.如何使用都是特征工程的范畴,特征工程需要具备数据分析的能力,那些称为数据科学家的人一定是有很强的特征工程能力的人.R ...
- R语言ETL系列:汇总(summarise)
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 本章讲解如何 ...
- left join 不重复_R语言ETL工程:连接(join)
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘.社交网络分析和机器学习等.希望与大家分享学习经验,推广并加深R语言在业界的应用. 邮箱:huang.tian-yuan@qq.com 本章将会介绍 ...
- rstudio python_【干货分享】R语言与数据分析系列之R与Rstudio的安装
第一章 R基础 一.什么是R 1.编程:面向对象的编程语言 2.使用者:有着统计分析功能及强大作图功能的软件 3.开发者:一组开源的数据操作 二.R的优点 免费.跨平台.简单易学.程序小巧.易扩展. ...
- R语言应用实战系列(五)-朴素贝叶斯算法以及ROC和PR曲线
前言 朴素贝叶斯(Naviebayes)的原理很简单:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为该代分项属于哪个类别? 以下是我为大家准备的几个精品专栏,喜欢的小伙 ...
- R语言应用实战系列(三)-智能推荐模型的构建
一.基本概念和原理 智能推荐的方法有很多,包括基于内容推荐,协同过滤推荐,基于关联规则,基于知识推荐,基于效用推荐和组合推荐. 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我 ...
- R语言应用实战系列(二)-基于R语言的方差分析
前言 回归分析重点考察变量间的相关关系或因果关系,当包含因子是解释变量时,关注点通常是从变量间的关系转向组与组之间的差异分析,这种分析样本组之间的区别的方法称为方差分析(Analysis of Var ...
最新文章
- mysql begin end 批量更新_MySql中4种批量更新的方法
- python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库
- [置顶] 删除:大数据取舍之道读书笔记
- 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
- 【Flink】FLink 如果watermark水印时间超出今天会是什么问题呢
- python + selenium - selenium常用元素定位
- 墨刀 vs Axure RP
- android列表的默认值,ListPreference默认值没有显示
- 你都用python来做什么-你都用 Python 来做什么?
- Rust 1.7.0 匹配器 match 的简单介绍和使用
- 西门子smart200 圆弧插补 整合画图程序 2轴3轴
- 【GlobalMapper精品教程】002:GlobalMapper中文版安装后的基本设置
- Java 二叉树的层序遍历
- 机器学习(时间序列):线性回归之虚拟变量 dummy variables
- MFC基于对话框使用dll进行多语言切换
- SpringBoot物流管理项目,拿去学习吧(源码)
- 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】
- ZJCTF-Triple Language Write up
- 餐饮门店每日业务情况数据分析仪表盘(外卖平台)
- 从联想昭阳到MacBook Pro,致我的那些败家玩意—
热门文章
- loadrunner录制脚本为空的情况
- 我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!...
- 别再用 Visio 了!试试这个比它快 10 倍的画图工具不香吗?
- 牛逼!在IDEA里搞Spring Boot Mybatis反向工程,太爽咯~
- 作为面试官,我是怎么快速判断程序员能力的?
- python三次方函数_python函数基础------第三次作业讲解(二)
- python基础之centos7源码安装python3
- KEYCODE_DPAD_CENTER 和 KEYCODE_ENTER
- 02--Activiti初始化表
- 使用jQuery快速高效制作网页交互特效(1)