R:使用带有附加列表的mapply作为参数

时间:2019-11-25 21:12:34

标签: r mapply

我有以下参数列表和向量:

myList <- list(c(3, 0, 1), c(2, 2, 2))
vPar1 <- c(1, 5, 100)
vPar2 <- c(100, 5, 1)

我正在尝试从3个Beta分布中提取形状参数为shape1 = vPar1shape2 = vPar2的样本(逐元素)。

预期结果将是一个包含两个元素的列表:第一个元素将包含4个随机数(3个来自Beta(1, 100),而1个来自Beta(100, 1)分布),而第二个列表元素将包含总共6个随机数(每个Beta(1, 100)Beta(5, 5)Beta(100, 1)分布的2个随机数)。

我尝试使用mapply产生所需的结果,即循环遍历3个参数的元素,但是我无法弄清楚应如何正确使用它:

mapply(function(x, shape1, shape2) {unlist(rbeta(x, shape1, shape2))}, 
          myList, 
          MoreArgs = list(shape1 = vPar1, shape2 = vPar2), 
          SIMPLIFY = FALSE)

这将产生一个包含两个元素的列表,但每个元素具有3个随机数,分别代表预期的4个和6个数字。如果有任何建议,我将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:4)

一种选择是用list遍历lapply,然后在Map内的嵌套lapply中将'vPar1'和'vPar2'作为参数应用< / p>

lapply(myList, function(x) unlist(Map(rbeta, n = x, shape1 = vPar1, shape2 = vPar2)))
#[[1]]
#[1] 0.031955823 0.001533638 0.012877288 0.998004973

#[[2]]
#[1] 0.021860350 0.002145949 0.514477229 0.479578366 0.996876238 0.992356962

它也可以写为

lapply(Map(Vectorize(rbeta), myList, MoreArgs = list(shape1 = vPar1, 
        shape2 = vPar2)), unlist)

答案 1 :(得分:1)

出于好奇,我想看看您是否可以在不嵌套lapply / Map的情况下执行此操作。我认为以这种方式没有任何好处,但是确实如此。使用Vectorize,这样就不必在Map内使用lapply(好吧,不必至少键入它),然后使用compose就可以了不必再进行一次lapply传递即可取消列出。

set.seed(1)
lapply(myList, purrr::compose(unlist, Vectorize(rbeta, SIMP = F)), 
       shape1 = vPar1, shape2 = vPar2)

# [[1]]
# [1] 0.0269188825 0.0074012868 0.0005853054 0.9941391825
# 
# [[2]]
# [1] 0.037118765 0.004534898 0.631806102 0.602790723 0.983948500 0.999301928