等待下一个秋

  • Spark
  • Flink
  • Hive
  • 数据仓库
  • 资料文档
  • Java
    • Spring
    • Mybatis
    • SpringBoot
    • 面试题
  • Python
    • Python基础
    • 爬虫
    • Numpy
    • matplotlib
    • Flask
  • 知识星球
  • 副业挣钱
  • 技术杂谈
    • Linux知识
    • Docker
    • Git教程
    • Redis教程
    • mysql
    • 前端
    • R语言
    • 机器学习
  • 其它
    • 关于我
    • 资料下载
    • 收徒弟
专注于Hadoop/Spark/Flink/Hive/数据仓库等
关注公众号:大数据技术派,获取更多学习资料。
  1. 首页
  2. 技术杂谈
  3. R语言
  4. 正文

R语言中的管道%>%

2021年6月9日 1027点热度 1人点赞 0条评论

%>%来自dplyr包的管道函数,我们可以将其理解为车间里的流水线,经过前一步加工的产品才能进入后一步进一步加工,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存。

符号%>%,这是管道操作,其意思是将%>%左边的对象传递给右边的函数,作为第一个选项的设置(或剩下唯一一个选项的设置。

简单例子
比如我们要算f(x)=sin((x+1)^2)在x=4的值,可以分为以下三步:

  • 计算a = x+1的值;
  • 计算b = a^2的值;
  • 计算c = sin(b)的值

这样一来,c就是我们需要的最终结果了。用R语言管道传参,只需要这样写:

f1 <- function(x){return(x+1)}

f2 <- function(x){return(x^2)}

f3 <- function(x){return(sin(x))}

管道(%>%)调用函数

library(dplyr) #用管道传参需要这个包

a <- 1

b <- a %>% f1 %>% f2 %>% f3

print(b)

[1] -0.7568025

管道传参具体用法
a%>%f(b)等同于f(a,b);

b%>%f(a,.,c)等同于f(a,b,c);

例如:

>library(dplyr)

> f1 <- function(x,y){return(x+y)}

> f2 <- function(x,y,z){return(x*y+z)}

> a1 <- 2

> a2 <- 3

> a3 <- 4

> d1 <- a1 %>% f1(a2)

> d1

[1] 5

> d2 <- a2 %>% f2(a1,.,a3)

> d2

[1] 10

> d3 <- a3 %>% f2(a1,a2,.)

> d3

[1] 10

创建一份数据:

> library(tidyr)

>date <- as.Date('2017-6-22')+0:14

> hour <- sample(1:24, 15)

> min <- sample(1:60, 15)

> second <- sample(1:60, 15)

> dat <- data.frame(date,hour,min,second)

> dat

date hour min second

1 2017-06-22 22 54 15

2 2017-06-23 7 51 4

3 2017-06-24 11 23 38

4 2017-06-25 23 45 50

5 2017-06-26 14 60 44

6 2017-06-27 5 24 56

7 2017-06-28 9 39 25

8 2017-06-29 20 22 22

9 2017-06-30 2 17 43

10 2017-07-01 17 56 31

11 2017-07-02 19 11 33

12 2017-07-03 24 35 18

13 2017-07-04 15 6 13

14 2017-07-05 4 12 47

15 2017-07-06 12 7 30

我们想把它变成标准时间格式,怎么办呢?“tidyr”包的函数unite()可以以指定字符连接指定列,形成新列,具体用法见下例:

> a1 <- rep(1,5)

> a2 <- rep(2,5)

> a3 <- rep(3,5)

> A <- data.frame(a1,a2,a3)

> A

a1 a2 a3

1 1 2 3

2 1 2 3

3 1 2 3

4 1 2 3

5 1 2 3

A1 <- unite(A,a12,a1,a2,sep = '~')

或者> A1 <- A %>% unite(a12,a1,a2,sep = '~')

对数据A的列a1,a2合并为新列a12,用“~”连接。

> A1

a12 a3

1 1~2 3

2 1~2 3

3 1~2 3

4 1~2 3

5 1~2 3

再来一步:

> A2 <- unite(A1,a123,a12,a3,sep = '/')

> A2 <- A1 %>% unite(a123,a12,a3,sep = '/')

对A1里面的a12与a3用“/”连接,形成新列“a123”。

> A2

a123

1 1~2/3

2 1~2/3

3 1~2/3

4 1~2/3

5 1~2/3

也可以用管道传参一步搞定:

> A %>%unite(a12,a1,a2,sep = '~') %>% unite(a123,a12,a3,sep = '/')

a123

1 1~2/3

2 1~2/3

3 1~2/3

4 1~2/3

5 1~2/3

回到我们的问题
看懂上例,就可以用管道传参一步搞定时间转换问题。

> dat1 <- dat %>%unite(datehour,date,hour,sep = ' ')%>%unite(datetime,datehour,min,second,sep = ':')

> dat1

datetime

1 2017-06-22 22:54:15

2 2017-06-23 7:51:4

3 2017-06-24 11:23:38

4 2017-06-25 23:45:50

5 2017-06-26 14:60:44

6 2017-06-27 5:24:56

7 2017-06-28 9:39:25

8 2017-06-29 20:22:22

9 2017-06-30 2:17:43

10 2017-07-01 17:56:31

11 2017-07-02 19:11:33

12 2017-07-03 24:35:18

13 2017-07-04 15:6:13

14 2017-07-05 4:12:47

15 2017-07-06 12:7:30

觉得不错,记得点赞哦,也可以分享、让更多的人看到!

标签: R语言
最后更新:2021年6月9日

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

打赏 点赞
< 上一篇

文章评论

取消回复

等待下一个秋

待我代码写成,便娶你为妻!专注于Hadoop/Spark/Flink/Hive/数据仓库等,关注公众号:大数据技术派,获取更多学习资料。

搜一搜
微信
最新 热点 随机
最新 热点 随机
logstash同步mysql数据到elasticsearch Spring IOC 容器源码分析 elasticsearch修改字段类型 curl操作elasticsearch常用命令 Python通过orm操作mysql数据库 Python进程管理——Supervisor
Spring IOC 容器源码分析logstash同步mysql数据到elasticsearch
黑客与画家 8.防止垃圾邮件的一种方法 Matplotlib 使用 LaTeX 渲染文本 Redis 分区 Spark面试题(八)——Spark的Shuffle配置调优 Hive面试题整理(二) Matplotlib 密致布局指南
标签聚合
Java 书籍 R语言 大数据 挣钱 Flink 算法 Hive Python 数据仓库 Redis mysql
文章归档
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年5月
  • 2020年4月
  • 2020年1月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年1月
  • 2018年12月
  • 2017年5月

©2022 ikeguang.com. 保留所有权利。

鄂ICP备2020019097号-1

鄂公网安备 42032202000160号