R语言tidyverse中如何对两个列表所有元素组合应用函数
map2的逻辑是按向量位置一一配对调用函数,当你传入长度都为2的.x = c(0,1)和.y = c(1,2)时,它只会生成(0,1)、(1,2)两组组合调用,自然只能得到2个结果,无法覆盖全部4种笛卡尔积组合。
解决方案1:使用cross2生成全组合后映射
直接调用purrr内置的cross2生成两个向量的所有元素组合,再用map批量执行函数即可:
library(tidyverse) # 生成mean和sd的全组合列表 param_combinations <- cross2(.x = c(0, 1), .y = c(1, 2)) # 对每个组合执行qnorm计算 full_result <- map(param_combinations, ~ qnorm(p = 0.05, mean = .x[[1]], sd = .x[[2]], lower.tail = FALSE))
输出的full_result就是你需要的4组结果:
[[1]] [1] 1.644854 [[2]] [1] 2.644854 [[3]] [1] 3.289707 [[4]] [1] 4.289707
解决方案2:参数表+逐行映射(更易溯源)
如果需要清晰对应每组结果的输入参数,可以先构造全组合参数数据框,再用pmap逐行计算,结果可直接存入数据框:
library(tidyverse) # 构造全组合参数表 param_df <- expand_grid( mean = c(0, 1), sd = c(1, 2) ) # 逐行计算并把结果写入新列 param_df <- param_df %>% mutate(qnorm_res = pmap_dbl(., ~ qnorm(p = 0.05, mean = ..1, sd = ..2, lower.tail = FALSE)))
最终得到的带结果的参数表如下:
# A tibble: 4 × 3 mean sd qnorm_res <dbl> <dbl> <dbl> 1 0 1 1.64 2 0 2 3.29 3 1 1 2.64 4 1 2 4.29
内容的提问来源于stack exchange,提问作者MYaseen208
相关产品推荐
相关产品推荐

