如何通过pmap在参数集上创建命名列表

时间:2019-07-17 01:30:57

标签: r tidyverse purrr

我有以下参数集和一个从params中获取值的函数

library(tidyverse)

set.seed(1)
params <- tribble(
  ~mean, ~sd, ~n, ~chosen_name, 
  5, 1, 1, "Param1", 
  10, 5, 3, "Param2"
)

my_norm_func  <- function(mean, sd, n, chosen_name) {
  rnorm(mean, sd, n) 
}

使用 pmap 通过以下方式执行时:

params %>% 
  pmap(my_norm_func)

我得到这个结果:

[[1]]
[1] 0.3735462 1.1836433 0.1643714 2.5952808 1.3295078

[[2]]
 [1]  2.538595  6.462287  7.214974  6.727344  4.083835  9.535344  6.169530  3.136278 -1.644100  8.374793

我要获取的是基于chosen_nameparams列的命名列表:

$Param1
[1] 0.3735462 1.1836433 0.1643714 2.5952808 1.3295078

$Param2
 [1]  2.538595  6.462287  7.214974  6.727344  4.083835  9.535344  6.169530  3.136278 -1.644100  8.374793

我应该怎么做才能做到这一点?是修改函数还是调用pmap。

1 个答案:

答案 0 :(得分:1)

最后使用set_names

library(dplyr)
library(purrr)
params %>% 
   pmap(my_norm_func) %>% 
   set_names(params$chosen_name)

或者另一个选择是deframe

library(tibble)
params %>% 
    transmute(newcol = pmap(., my_norm_func), chosen_name) %>% 
    select(chosen_name, newcol) %>% 
    deframe
#$Param1
#[1] -0.9143594  2.1765833 -0.6649724  0.5364696 -0.1159201

#$Param2
# [1]  2.7475430 11.2614996  5.0521869  1.1410984  0.0781834  6.3505613  4.9443205  4.0457949  2.2119136  0.5376191

或者另一种方法是通过以list输出并用'chosen_name and then flatten the list`命名列表元素来修改功能。

my_norm_func  <- function(mean, sd, n, chosen_name) {
   list(rnorm(mean, sd, n)) %>%
      set_names(chosen_name)
   }

params %>%
   pmap(my_norm_func) %>%
   flatten
#$Param1
#[1] 3.3079784 1.1058024 1.4569988 0.9228471 0.6659992

#$Param2
# [1]  4.8958219  7.3629188 11.2257350  8.0821773  8.6237252  1.3060297  7.9516867  5.6597744  0.5982499  6.5630682