我有以下参数集和一个从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_name
中params
列的命名列表:
$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。
答案 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