浅析R语言中map(映射)与reduce(规约)

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的详细内容,更多关于R语言map与reduce的资料请关注我们其它相关文章!

(0)

相关推荐

  • R语言对Excel文件操作实例

    Microsoft Excel是最广泛使用的电子表格程序,以.xls或.xlsx格式存储数据. R语言可以直接从这些文件使用一些excel特定的包. 很少这样的包是XLConnect,xlsx,gdata等.我们将使用xlsx包. R语言也可以使用这个包写入excel文件. 安装xlsx软件包 您可以在R控制台中使用以下命令来安装"xlsx"软件包. 它可能会要求安装一些额外的软件包这个软件包依赖. 按照具有所需软件包名称的同一命令安装其他软件包. install.packages(&

  • R语言处理JSON文件的方法

    JSON文件以人类可读格式将数据存储为文本. Json代表JavaScript Object Notation. R可以使用rjson包读取JSON文件. 安装rjson包 在R语言控制台中,您可以发出以下命令来安装rjson包. install.packages("rjson") 输入数据 通过将以下数据复制到文本编辑器(如记事本)中来创建JSON文件. 使用.json扩展名保存文件,并将文件类型选择为所有文件(*.*). { "ID":["1"

  • R语言中逻辑回归知识点总结

    逻辑回归是回归模型,其中响应变量(因变量)具有诸如True / False或0/1的分类值. 它实际上基于将其与预测变量相关的数学方程测量二元响应的概率作为响应变量的值. 逻辑回归的一般数学方程为 y = 1/(1+e^-(a+b1x1+b2x2+b3x3+...)) 以下是所使用的参数的描述 y是响应变量. x是预测变量. a和b是作为数字常数的系数. 用于创建回归模型的函数是glm()函数. 语法 逻辑回归中glm()函数的基本语法是 glm(formula,data,family) 以下是

  • 浅析R语言中map(映射)与reduce(规约)

    map(映射)与reduce(规约)操作在数据处理中非常常见,R语言的核心是向量化操作,自带的apply系列函数完成了数据框的向量化计算,而purrr包中的map与reduce系列函数很好的拓展了向量化计算,使R语言处理数据更加优雅流畅. purrr包是tidyverse系列中的包,开发者是大名鼎鼎的Hadley Wickham.purrr包中的函数很多,使用最多的是map与reduce系列函数. 安装包 install.packages('purrr') map map表示映射,可以在一个或多

  • R语言中ggplot2绘制双坐标轴图

    R包ggplot2绘图精美,可以做出很复杂的图形,深受用户喜爱.它的作者hadley并不推荐使用ggplot2绘制双坐标轴图,认为这样会增加读图的难度,但是目前需要双坐标轴图应用的场景还是很多,如下图形直方图和曲线分别有不同的坐标轴,表示不同的意思,图片展示内容比较丰富 今天我们通过我们的汽车销售数据(公众号回复:汽车销售,可以获得数据)来演示一下ggplot2绘制双坐标轴图,主要是通过sec.axis函数进行转换,进行第二个坐标轴的转换.我们先来导入数据 library(foreign) li

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • R语言中的vector(向量),array(数组)使用总结

    对于那些有一点编程经验的人来说,vector,matrix,array,list,data.frame就相当于编程语言中的容器,因为只是将R看做数据处理工具所以它们的底层是靠什么实现的,内存怎么处理的具体也不要深究. R语言很奇怪的是它是面向对象的语言,所以经常会调用系统的方法,而且更奇怪的是总是调用"谓语"的方法,用起来像是写句子一样,记起来真是让人费解.比如is.vector(),read.table(),as.vector().. 直接开始吧:(由于习惯,大部分用"=&

  • R语言中R-squared与Adjust R-squared参数的解释

    前言 最近做项目时,使用 R语言对一些数据做回归计算,分析数据时,想查看这堆数据的相关性,得知R-squared可以得到我想要的信息,但是在打印线性关系式时,看到了R-squared,Adjust R-squared 这两个参数,有点疑惑,上网也查看了一部分资料,最后,发现有两道题可以很明白解释这两个参数,如下: 题一 如果在线性回归模型中增加一个特征变量,下列可能发生的是(多选)? A. R-squared 增大,Adjust R-squared 增大 B. R-squared 增大,Adju

  • R语言中cbind、rbind和merge函数的使用与区别

    cbind: 根据列进行合并,即叠加所有列,m列的矩阵与n列的矩阵cbind()最后变成m+n列,合并前提:cbind(a, c)中矩阵a.c的行数必需相符 rbind: 根据行进行合并,就是行的叠加,m行的矩阵与n行的矩阵rbind()最后变成m+n行,合并前提:rbind(a, c)中矩阵a.c的列数必需相符 > a <- matrix(1:12, 3, 4) > print(a) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,

  • R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不严谨但是通俗的说法,判别分析(Discriminant Analysis)是一种多元(多个变量)统计分析方法,它根据样本的多个已知变量的值对样本进行分类的方法.一般来说,判别分析由两个阶段构成--学习(训练)和判别.在学习阶段,给定一批已经被分类好的样本,根据它们的分类情况和样本的多个变量的值来学习

  • R语言中for循环的并行处理方式

    前言 本文用于记录笔者在将R语言中的for语句并行化处理中的一些问题. 实验 这里使用foreach和doParallel包提供的函数实现for语句的并行处理. for语句脚本 func <- function(x, y, z) { return(x^y/z) } # >>> main <<< x <- 2 y <- 3 z <- 1:100000 start <- (proc.time())[3][[1]] a <- 0 for (

  • R语言中的fivenum与quantile()函数算法详解

    fivenum()函数: 返回五个数据:最小值.下四分位数数.中位数.上四分位数.最大值 对于奇数个数字=5,fivenum()先排序,依次返回最小值.下四分位数.中位数.上四分位数.最大值 > fivenum(c(1,12,40,23,13)) [1] 1 12 13 23 40 对于奇数个数字>5,fivenum()先排序,我们可以求取最小值,最大值,中位数.在排序中,最小值与中位数中间,若为奇数,取其中位数为下四分位数,若为偶数,取最中间两个数的平均值为下四分位数:在排序中,中位数与最大

随机推荐