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

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

有没有一些时候你想要给表格加一个新的列?本章将会介绍如何在表格中创建新的字段。但是首先我们要知道为什么要什么做,下面是可能的一些情况:

  • 有时候需要构造一列全部是0或1的数列,或者是给每一个记录赋予一个不同的ID;

  • 购物数据中,含有单价和数量,需要计算交易额,然后加入到表格中;

  • 我们数据中有年月日的数据,我们需要把它们拼接成一个字符格式,比如,2018年10月10日,我们需要表示为20181010或者2018/10/10;

在tidyverse中,我们可以用mutate函数给表格增加新的一列。下面将会分节介绍,首先载入我们需要的数据和包:

1library(tidyverse)2library(nycflights1

添加常数列

这里举一个简单的例子,用iris数据集,增加一个完全为0的新列,我们会限制输出列为前六行,以免输出内容过多。

 1iris %>% 2  mutate(zeros = 0) %>% 3  head 4##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species zeros 5## 1          5.1         3.5          1.4         0.2  setosa     0 6## 2          4.9         3.0          1.4         0.2  setosa     0 7## 3          4.7         3.2          1.3         0.2  setosa     0 8## 4          4.6         3.1          1.5         0.2  setosa     0 9## 5          5.0         3.6          1.4         0.2  setosa     010## 6          5.4         3.9          1.7         0.4  setosa     0

可以看到我们已经新增了一列,名字叫做zeros,里面的值全部是0。 SQL代码如下:

1 SELECT `Sepal.Length`, `Sepal.Width`, `Petal.Length`, `Petal.Width`, `Species`, 0.0 AS `zeros`2FROM `iris`

算数运算

本例会用到flights数据,这个表中包含了航班的起飞时间(dep_time)和到达时间(arr_time),如果需要知道中间经理了多长时间,我们需要将两者相减。我们会先把两列取出来,然后再构造新的列:

 1flights %>% 2  select(dep_time,arr_time) %>% 3  mutate(time = arr_time - dep_time) 4## # A tibble: 336,776 x 3 5##    dep_time arr_time  time 6##             7##  1      517      830   313 8##  2      533      850   317 9##  3      542      923   38110##  4      544     1004   46011##  5      554      812   25812##  6      554      740   18613##  7      555      913   35814##  8      557      709   15215##  9      557      838   28116## 10      558      753   19517## # ... with 336,766 more rows

这样一来我们就把飞行时间储存在time列中。事实上我们还可以这么表达:

 1flights %>% 2  transmute(dep_time,arr_time,time = arr_time - dep_time) 3## # A tibble: 336,776 x 3 4##    dep_time arr_time  time 5##             6##  1      517      830   313 7##  2      533      850   317 8##  3      542      923   381 9##  4      544     1004   46010##  5      554      812   25811##  6      554      740   18612##  7      555      913   35813##  8      557      709   15214##  9      557      838   28115## 10      558      753   19516## # ... with 336,766 more rows

得到结果与上面一致。transmute函数的特点就是,不会保存数据表中原有的列,自动完成了select的功能。SQL代码如下:

1 SELECT `dep_time`, `arr_time`, `arr_time` - `dep_time` AS `time`2FROM (SELECT `dep_time`, `arr_time`3FROM `flights`)

文本的拼接与拆分

这个例子中,我们来看flights数据,它包含了年(year)、月(month)、日(day)、起始点(origin)、终点(dest)的数据列,首先我们把这些列取出来存放到新的变量中,并进行观察:

 1flights %>% 2  select(year,month,day,origin,dest) -> fl_ymd 3 4fl_ymd 5## # A tibble: 336,776 x 5 6##     year month   day origin dest  7##          8##  1  2013     1     1 EWR    IAH   9##  2  2013     1     1 LGA    IAH  10##  3  2013     1     1 JFK    MIA  11##  4  2013     1     1 JFK    BQN  12##  5  2013     1     1 LGA    ATL  13##  6  2013     1     1 EWR    ORD  14##  7  2013     1     1 EWR    FLL  15##  8  2013     1     1 LGA    IAD  16##  9  2013     1     1 JFK    MCO  17## 10  2013     1     1 LGA    ORD  18## # ... with 336,766 more rows

现在,我们想要把第一行的起始点和终点拼接为“EWR_IAH”的格式,放在名为origin_dest的列中,下面我们进行操作:

 1fl_ymd %>% 2  mutate(origin_dest = str_c(origin,dest,sep = "_")) -> fl_ymd.1 3 4fl_ymd.1 5## # A tibble: 336,776 x 6 6##     year month   day origin dest  origin_dest 7##                 8##  1  2013     1     1 EWR    IAH   EWR_IAH     9##  2  2013     1     1 LGA    IAH   LGA_IAH    10##  3  2013     1     1 JFK    MIA   JFK_MIA    11##  4  2013     1     1 JFK    BQN   JFK_BQN    12##  5  2013     1     1 LGA    ATL   LGA_ATL    13##  6  2013     1     1 EWR    ORD   EWR_ORD    14##  7  2013     1     1 EWR    FLL   EWR_FLL    15##  8  2013     1     1 LGA    IAD   LGA_IAD    16##  9  2013     1     1 JFK    MCO   JFK_MCO    17## 10  2013     1     1 LGA    ORD   LGA_ORD    18## # ... with 336,766 more rows

我们可以看到,使用mutate函数可以增加一列,而这一列通过str_c函数,把两列拼接起来,中间的分隔符号设定为下划线(“_“)。此外,我们可以用unite函数完成这个任务:

 1#等价于 2fl_ymd %>% 3  unite(col = origin_dest,origin,dest) -> fl_ymd.2 4 5fl_ymd.2 6## # A tibble: 336,776 x 4 7##     year month   day origin_dest 8##              9##  1  2013     1     1 EWR_IAH    10##  2  2013     1     1 LGA_IAH    11##  3  2013     1     1 JFK_MIA    12##  4  2013     1     1 JFK_BQN    13##  5  2013     1     1 LGA_ATL    14##  6  2013     1     1 EWR_ORD    15##  7  2013     1     1 EWR_FLL    16##  8  2013     1     1 LGA_IAD    17##  9  2013     1     1 JFK_MCO    18## 10  2013     1     1 LGA_ORD    19## # ... with 336,766 more rows

unite中的col参数是新的列名称,后面可以放任意多的列,最后会把放进去的列都拼接起来。

unite函数是专门用来对不同列之间字符串进行拼接的函数,默认的间隔符号就是“_”,但是可以通过sep参数改变分隔符。此外,我们可以注意到,如果利用unite函数,原始的两列origin和dest会消失,而mutate则是单纯增加一列。

那么,如果我们想要把已经拼接好的数据拆分出来,应该怎么做呢?我们现在就来对flm_ymd.2的origin_dest列进行拆分操作,这里我们会用到separate函数:

 1fl_ymd.2 %>% 2  separate(col = origin_dest, into = c("origin","dest")) 3## # A tibble: 336,776 x 5 4##     year month   day origin dest  5##          6##  1  2013     1     1 EWR    IAH   7##  2  2013     1     1 LGA    IAH   8##  3  2013     1     1 JFK    MIA   9##  4  2013     1     1 JFK    BQN  10##  5  2013     1     1 LGA    ATL  11##  6  2013     1     1 EWR    ORD  12##  7  2013     1     1 EWR    FLL  13##  8  2013     1     1 LGA    IAD  14##  9  2013     1     1 JFK    MCO  15## 10  2013     1     1 LGA    ORD  16## # ... with 336,766 more rows

我们可以看到,separate其实是unite的逆运算,col中赋值的是需要拆分的列名称,into则是拆分之后不同部分的名称。 separate也有sep参数,可以调整参数来根据特殊符号进行拆分,默认的拆分参数是所有非字母符号。如果大家要用中文的话,应该注意,一定要使用sep参数,也就是应该写成“fl_ymd.2 %>% separate(col =origin_dest, into = c(”origin“,”dest“),sep =”_“)”。

本章中,我们讲了如何用mutate创建字段。我们可以灵活地使用mutate函数,构造一个常数列,或者基于原始的数据列进行数学运算,从而构成新的列。这些知识对于机器学习中的特征工程尤为重要,是必须掌握的基础。最后,我们还介绍了如何对字符型的变量进行拼接和拆分,如果需要进行文本挖掘的话,这些技能是必不可少的。

往期精彩:

  • “IT男等级”对照表|找找你在哪?

  • 不用代码,从搜索数据中解读星巴克“猫爪杯”如何挠你的心

  • 功不唐捐,每日一道LeetCode,玉汝于成,终获offer满满!

  • R语言中文社区2018年终文章整理(作者篇)

  • R语言中文社区2018年终文章整理(类型篇)

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

回复 爬虫            爬虫三大案例实战回复 Python       1小时破冰入门回复 数据挖掘     R语言入门及数据挖掘回复 人工智能     三个月入门人工智能回复 数据分析师  数据分析师成长之路 回复 机器学习     机器学习的商业应用回复 数据科学     数据科学实战回复 常用算法     常用数据挖掘算法

给我【好看】

你也越好看!

sql 字段相减_R语言ETL系列:创建字段(mutate)相关推荐

  1. sql中两个表的某列相减_sql两个字段相减语句

    sql 两个字段相减语句本文章搜索了大量来自网络的关于sql 两个字段相减语句与函数代码,举例说明了两个字段相减做法. sql 两个字段相减语句 本文章搜索了大量来自网络的关于sql 两个字段相减语句 ...

  2. 不同数据库中两列字段相减(某列有空值)

    数据库中两个字段相减(某列有空值)处理方法: sql server中:select (isnull(字段1,0)-isnull(字段2,0)) as 结果 from 表 oracle中:select ...

  3. mysql 时间相减取秒_MySQL两个日期字段相减得到秒的方法

    一.MySQL中两个DateTime字段相减 假定表名为tblName,两个DateTime字段名分别为beginDateTime,endDateTime,以下是相关两个mysql日期字段相减的SQL ...

  4. mysql 相同字段相减_mysql datetime 类型字段相减

    背景:今天测试一个mariadb中datatime类型的字段相减问题,直接用2个字段相减得到的数值并不是秒,很坑. 后面百度了一些方法,说是使用 DateDiff 函数,这个函数文档还说有3个参数,但 ...

  5. pgsql 两个时间字段相减_如何在Excel做专业的时间序列分析

    一.工具产生背景 在生产中我们常会根据历史数据去预测未来的发展趋势.比如客户投诉量.用户留存率.页面点击率等等. 对于预测功能的需求多但是具备相应能力的分析师却很少.想做出一份精准的预测需要具备很多专 ...

  6. 像个字段相减绝对值_【高考数学】33个知识点+66个易混点大整合

                    乐学数韵(ID/抖音:Vlxsy8   视频号/B站:乐学数韵)  教研.解题.资源 Q群: 314559613  ,1078982440 (2群) 相关链接: 数学干 ...

  7. informix sql日期相减

    需求:日期相减得到带小数点的天数差值 参考思路:informix 计算 日期之差_zhengqiqiqinqin的博客-CSDN博客_informix 时间差 写sql语句: select (oper ...

  8. r语言中mpg数据_R语言数据分析系列之五

    R语言数据分析系列之五 本节来讨论一下R语言的基本图形展示,先来看一张效果图吧. 这是一张用R语言生成的,虚拟的wordcloud云图,详细实现细节请參见我的github项目:https://gith ...

  9. [数据库 开发] SQL两字段相减

    方法1: ISNULL PS: ISNULL函数是判断字段时候为null,如果为null返回0. SELECT ISNULL(A字段,0)-ISNULL(B字段,0) FROM 表 方法2: case ...

最新文章

  1. 点分治问题 ----------- 2017杭州CCPC E.Master of Subgraph[bitset+点分治]
  2. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的...
  3. xmpp with openfire之一 xmpp and openfire
  4. 数据包分片和重组 MTU与MSS
  5. Centos 7安装与配置nagios监控(一)
  6. 【语义分割】评价指标代码函数:np.sum()、np.nansum()、np.nanmean()、np.diag()、np.bincount()
  7. 「镁客·请讲」南京布塔:用动作捕捉世界的精彩
  8. linux tomcat守护_linux 设置tomcat为守护进程教程
  9. QT记事本的读写函数
  10. 谷歌浏览器官网默认只能下载在线安装包(只有几兆大小)若想下载完整的离线安装包,可以用以下官方链接
  11. Spring Boot框架从入门到精通
  12. HSSFWorkbook 锁定部分单元格,或者锁定一个单元格
  13. 在IE8中使用建行企业网银的解决方法
  14. 如何打造百万爆款短视频?普通人如何通过短视频赚钱?3分钟学会
  15. 微信小程序剪切图片的功能
  16. js function后面小括号
  17. 快速排序详细图解分析(含代码示例)
  18. Android Studio:Caused by: java.lang.ClassNotFoundException: Didn‘t find class “...“on path: DexPath*
  19. 你知道这几种常用的电阻测试方法吗?2021-08-23
  20. sentence-BERT

热门文章

  1. c语言 中断 局部变量 not allocated,C语言(函数)调用过程(略译)
  2. 风吹来_“秃如其来”的年轻人,如何才能让头发“春风吹又生”?
  3. go语言和java比_python与java、php、go的优势对比,各语言不要引起恐慌哈
  4. MySQL 引擎 阿里_MySQL引擎讲解-阿里云开发者社区
  5. mysql数据库容量为多少GB_MySQL数据库单表容量有多少 MySQL数据库使用教程
  6. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?
  7. Java 计算数学表达式(字符串解析求值工具)
  8. 新微擎 v1.7.9 图文回复 标题emoji
  9. 4g伪基站如何实现的
  10. 全新的PDO数据库操作类(仅适用Mysql)