map(映射)与reduce(规约)操作在数据处理中非常常见,R语言的核心是向量化操作,自带的apply系列函数完成了数据框的向量化计算,而purrr包中的map与reduce系列函数很好的拓展了向量化计算,使R语言处理数据更加优雅流畅。

purrr包是tidyverse系列中的包,开发者是大名鼎鼎的Hadley Wickham。purrr包中的函数很多,使用最多的是mapreduce系列函数。

安装包

install.packages('purrr')

map

map表示映射,可以在一个或多个列表/向量的每个位置上应用相同函数进行计算。map函数的映射对象只有一个。

map(.x, .f, …)
.x: 列表或向量;
.f: 映射函数;
...: 映射函数的其他参数

# 加载包
library(purrr)
# 单个向量map
1:4 %>%map(rnorm)
## [[1]]
## [1] 0.1892454
##
## [[2]]
## [1] -1.149757  1.782667
##
## [[3]]
## [1] 0.9311241 0.5962078 0.8575180
##
## [[4]]
## [1]  1.2708588  0.7957794 -0.0106283  0.5393979

map函数的结果来看,其返回与输入向量等长的结果,类型为列表

其他参数

可以指定映射函数的其他参数:

# 单个向量map,指定函数参数
1:4 %>%map(rnorm,mean=1,sd=2)
## [[1]]
## [1] 1.610763
##
## [[2]]
## [1] -0.4034499  1.5814313
##
## [[3]]
## [1] 2.806429 1.719962 2.005490
##
## [[4]]
## [1] 2.170663 2.849836 1.085069 4.130320

匿名函数

传入的函数可以是匿名函数:

# 单个向量map,使用匿名函数
1:4 %>%map(function(x) rnorm(x))
## [[1]]
## [1] 0.01422782
##
## [[2]]
## [1] 1.7895586 0.7135593
##
## [[3]]
## [1]  0.0603224  1.0498781 -1.0028828
##
## [[4]]
## [1]  0.2673761 -1.1297717  0.7769814  1.5304043

公式函数

还可以把函数当成一个公式传入,这是purrr提供的高级功能,能够简化代码量。

  • 当函数只有一个参数时,公式函数中用.x代替参数;
  • 当函数有两个参数时,公式函数中用.x,.y代替参数;
  • 当函数有多个参数时,公式函数中用..1,..2,..3代替参数。
# 单个向量map,使用公式函数
1:4 %>%map(~rnorm(.x))
## [[1]]
## [1] -1.471681
##
## [[2]]
## [1] -0.04243286 -0.68348293
##
## [[3]]
## [1]  1.613470 -0.750001 -1.278718
##
## [[4]]
## [1]  0.9369563 -0.5285622  0.8601058  1.8868754

map2

map2函数是map函数的变形,映射对象有两个,需要注意两个列表/向量的长度必须相同

map2(.x,.y, .f, …)
.x: 列表或向量;
.y: 列表或向量,与.x等长;
.f: 映射函数;
...: 映射函数的其他参数

# 两个向量map
map2(1:3,2:4,sum)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 5
##
## [[3]]
## [1] 7

用公式函数的方式:

# 两个向量map,使用公式函数
map2(1:3,2:4,~sum(.x,.y))
## [[1]]
## [1] 3
##
## [[2]]
## [1] 5
##
## [[3]]
## [1] 7
# 两个向量map,使用公式函数
map2(1:3,2:4,~sum(..1,..2))
## [[1]]
## [1] 3
##
## [[2]]
## [1] 5
##
## [[3]]
## [1] 7

pmap

pmap函数是map函数的变形,映射对象为多个,需要注意多个列表/向量的长度必须相同

pmap(.l, .f, …)
.l: 列表向量/列表;
.f: 映射函数;
...: 映射函数的其他参数

# 多个向量map
pmap(list(1:3,2:4,3:5),sum)
## [[1]]
## [1] 6
##
## [[2]]
## [1] 9
##
## [[3]]
## [1] 12

用公式函数的方式:

# 多个向量map,使用公式函数
pmap(list(1:3,2:4,3:5),~sum(..1,..2,..3))
## [[1]]
## [1] 6
##
## [[2]]
## [1] 9
##
## [[3]]
## [1] 12

map变形

map,map2pmap返回的数据格式都是列表,有时候需要对返回的结果进行数据格式转换,这时候可以直接使用map系列的变形函数,直接一步完成。

# 返回列表
map(mtcars,mean)
## $mpg
## [1] 20.09062
##
## $cyl
## [1] 6.1875
##
## $disp
## [1] 230.7219
##
## $hp
## [1] 146.6875
##
## $drat
## [1] 3.596563
##
## $wt
## [1] 3.21725
##
## $qsec
## [1] 17.84875
##
## $vs
## [1] 0.4375
##
## $am
## [1] 0.40625
##
## $gear
## [1] 3.6875
##
## $carb
## [1] 2.8125

使用map_df函数,直接返回数据框格式。

# 返回数据框
map_df(mtcars,mean)
## # A tibble: 1 x 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  20.1  6.19  231.  147.  3.60  3.22  17.8 0.438 0.406  3.69  2.81
# 返回字符向量
map_chr(mtcars,mean)
##          mpg          cyl         disp           hp         drat           wt
##  "20.090625"   "6.187500" "230.721875" "146.687500"   "3.596563"   "3.217250"
##         qsec           vs           am         gear         carb
##  "17.848750"   "0.437500"   "0.406250"   "3.687500"   "2.812500"

其他的有:

  • map_lgl/map2_lgl/pmap_lgl:返回逻辑向量;
  • map_int/map2_int/pmap_int:返回整数向量;
  • map_dbl/map2_dbl/pmap_dbl:返回浮点数向量;
  • map_chr/map2_chr/pmap_chr:返回字符串向量。

reduce

reduce函数表示规约,计算向量中相邻的两个元素,结果再与第三个元素计算,…,最后计算出一个值。

reduce(.x, .f, …)
.x: 列表向量/列表;
.f: 规约函数;
...: 函数的其他参数

# 单个向量reduce
reduce(1:5,paste)
## [1] "1 2 3 4 5"

reduce2

reduce2函数可以同时对两个向量进行规约计算,注意第二个向量长度需要比第一个向量小1

reduce2(.x, .y,.f, …)
.x: 列表向量/列表;
.y: 列表向量/列表,长度比.x小1;
.f: 规约函数;
...: 函数的其他参数

# 多个向量reduce
reduce2(1:4,c(1,1,1),function(x,y,z) x+y-z)
## [1] 7

计算逻辑为第一次:1+2-1=2,第二次2+3-1=4,第三次4+4-1=7。

更多的purrr包中函数用法,可以参考:cheatsheet

R语言--map与reduce相关推荐

  1. R语言使用ggplot2包和maps包可视化美国地图、使用北美犯罪率数据为不同区域的地图渲染(颜色深浅区分犯罪率高低、US map colored by violent crime rates)

    R语言使用ggplot2包和maps包可视化美国地图.使用北美犯罪率数据为不同区域的地图渲染(颜色深浅区分犯罪率高低.US map colored by violent crime rates) 目录

  2. R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)

    R语言dplyr包使用recode函数进行数据列内容编码.转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值) 目录

  3. R语言使用ggplot2包和maps包可视化世界地图(world map)、自定义填充色为浅灰色lightgray、背景为白色

    R语言使用ggplot2包和maps包可视化世界地图(world map).自定义填充色为浅灰色lightgray.背景为白色 目录

  4. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  5. Python 函数式编程Map、Reduce

    在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算.它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架. ...

  6. [原]数据科学教程:R语言与NoSQL

    介绍 现代化数据科学中的 DataFrame 概念源起R语言,而 Python Pandas 和 Spark DateFrame 都是参考R设计的.不过在实际的网络数据通讯中,类似DateFrame这 ...

  7. R语言函数式编程(Functional Programming)概念

    R语言函数式编程概念 functional 泛函 R语言的函数是first-class function 一等函数,higher-order function高阶函数,函数可以作为函数参数传入,这些特 ...

  8. R语言可视化学习笔记之ggridges包

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  9. R语言ggplot2地理信息可视化(下)

    很荣幸,能来北京参加2018年第十一届中国R会议,并在中国人民大学-R语言数据可视化会场作报告. 本次演讲题目:<R语言ggplot2之地理信息可视化>,本次演讲重点讲解R语言基于ggpl ...

最新文章

  1. linux 安装安装rz/sz 和 ssh
  2. Microbiome:根系分泌物驱动土壤记忆抵御植物病原菌
  3. Nginx流量拦截算法
  4. Educational Codeforces Round 107 (Rated for Div. 2) 题解
  5. VC++6.0安装步骤
  6. android 结束if循环_简单探究Android平台下' if ' 语句条件判断耗时情况
  7. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解
  8. SSM Generator生成mapper中xml文件:未能解析映射资源:“文件嵌套异常
  9. 《通信原理》复习笔记6----第六章数字基带传输系统(重中之重点+难上加难点)
  10. web前端开发技术(第3版)储九良著课后实验
  11. 计算机论文3000字文献,计算机学术论文3000字计算机学术毕业论文范文模板.pdf
  12. 一张图了解CAS单点登录的流程
  13. PDF破解FileOpenPlugin加密的方法
  14. Powershell-快速编辑模式和标准模式
  15. 01 HA haproxy 功能简介以及应用
  16. K8s实战一:基本概念与命令二
  17. 毕业论文Word格式订正技巧
  18. 我在成都火车站捡了个彝族美女 第1节:车站捡来的美女
  19. 8、什么是响应式设计?响应式设计的基本原理是什么?如何做?
  20. html实现颜料效果,JS基于HTML5的canvas标签实现炫目的色相球动画效果实例

热门文章

  1. 软件实习实验四 校园一卡通数据库管理系统的开发
  2. Mysql 检查表是否存在并创建表,检查列是否存在并新增、修改、删除列
  3. 计算机网络之面试常考--整理来自牛客网
  4. 原生分页查询原理步骤解析
  5. 计算机音乐童话,童话故事背景音乐
  6. 作为一名程序员,你知道1024程序员是怎么来的么?
  7. SecureCRT乱码的问题
  8. 后向投影算法(BPA)-SAR成像算法系列(二)
  9. 综合搜索大全-115搜索
  10. dcdc模块降额设计_专业电源模块生产厂家能动电子入驻拍明芯城,达成战略合作关系...