专业编程基础技术教程

网站首页 > 基础教程 正文

R数据分析:map()函数的升级版map2()和pmap()介绍

ccvgpt 2024-12-03 10:52:31 基础教程 1 ℃

对一个向量运行一个函数并输出一个向量我们可以用map()函数,相信大家都会,看一个例子:

mu <- list(5, 10, -3)
mu %>% 
  map(rnorm, n = 5) %>% 
  str()
#> List of 3
#>  $ : num [1:5] 5.63 7.1 4.39 3.37 4.99
#>  $ : num [1:5] 9.34 9.33 9.52 11.32 10.64
#>  $ : num [1:5] -2.49 -4.75 -2.11 -2.78 -2.42

上面的map()分别以(5, 10, -3)为均值输出了默认标准差为1的5个随机数。那么,一个函数同时用多个向量作参数的情况怎么处理呢?这篇文章就来尝试回答这个问题。

R数据分析:map()函数的升级版map2()和pmap()介绍

还是上面的例子,我现在不想产生的随机数的标准差是默认的1了,我想给它一组向量作为标准差,怎么做?看代码:

sigma <- list(1, 5, 10)
seq_along(mu) %>% 
  map(~rnorm(5, mu[[.]], sigma[[.]])) %>% 
  str()
#> List of 3
#>  $ : num [1:5] 4.82 5.74 4 2.06 5.72
#>  $ : num [1:5] 6.51 0.529 10.381 14.377 12.269
#>  $ : num [1:5] -11.51 2.66 8.52 -10.56 -7.89

上面的代码实现了用两个向量mu,sigma中的元素分别作为均值和标准差产生随机数,但是上面的例子中用[[.]]来取元素,不太实用也不太好读哦。再看用map2怎么写

map2(mu, sigma, rnorm, n = 5) %>% str()
#> List of 3
#>  $ : num [1:5] 3.83 4.52 5.12 3.23 3.59
#>  $ : num [1:5] 13.55 3.8 8.16 12.31 8.39
#>  $ : num [1:5] -15.872 -13.3 12.141 0.469 14.794

map2可以取两个向量作为参数,最终输出向量,上例的图解如下图:


map2其实也就是一个for循环:

map2 <- function(x, y, f, ...) {
  out <- vector("list", length(x))
  for (i in seq_along(x)) {
    out[[i]] <- f(x[[i]], y[[i]], ...)
  }
  out
}

map2取2个向量,相应的你可以扩展到map3(), map4(), map5(), map6(),但是这样并不符合简介的思想,相应的我们用一个pmap()就包含了上面的所有的map。看下例:

n <- list(1, 3, 5)
args1 <- list(n, mu, sigma)
args1 %>%
  pmap(rnorm) %>% 
  str()
#> List of 3
#>  $ : num 5.39
#>  $ : num [1:3] 5.41 2.08 9.58
#>  $ : num [1:5] -23.85 -2.96 -6.56 8.46 -5.21

例子生成了一个不同长度,不同均值,不同标准差的随机数,过程图解如下:


这个时候更加清晰的写法应该是给相应的作为参数的向量加上参数名:

args2 <- list(mean = mu, sd = sigma, n = n)
args2 %>% 
  pmap(rnorm) %>% 
  str()


这样相信大家都能看懂了。

小结

今天给大家写了如何用多个向量做参数-pmap的使用,内容来自《R for datascience》感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么基础没有从零学Python和R的,加油。

(站外链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)

往期内容:

R数据分析:如何用R做数据模拟

R数据分析:R Markdown:数据分析过程报告利器,你必须得学呀

R数据分析:tidyverse中常用的解析函数总结

最近发表
标签列表