1

现在我正在学习如何在 r 中使用 purrr 包,并思考如何生成 1、2、...、99、100 次掷硬币的 5 个样本。我的形象是创建一个列表,应该看起来像..

[[1]]

[[1]]
[1] 1 0 1 0 0

[[2]]

[[1]]
[1] 1 0 0 0 1

[[2]]
[1] 0 1 0 1 1

[[3]]

[[1]]
[1] 0 1 1 1 0

[[2]]
[1] 1 0 0 0 1

[[3]]
[1] 0 1 1 1 1

..

谁能帮我弥补这个?

4

2 回答 2

3

您希望使用 map 函数将函数rerun应用于向量的每个元素,1:100如下所示

library(purrr)
1:100 %>% map(function(x) rerun(x, rbinom(5,1,.5)))

但是,它同样易于使用replicate,其中复制的默认值是生成一个按列排列的数组。

lapply(1:100, function(x) replicate(x,rbinom(5,1,0.5)))

请注意,在这种情况下,基本 R 表达式要快得多。

a <- function() 1:100 %>% map(function(x) rerun(x, rbinom(5,1,.5)))
b <- function() lapply(1:100, function(x) replicate(x,rbinom(5,1,0.5)))

library(microbenchmark)
microbenchmark(a(),b())

Unit: milliseconds
 expr      min        lq      mean    median        uq      max  neval cld
  a() 96.89941 104.83822 117.10245 111.48309 120.28554 391.9411  100   b
  b() 16.88232  18.47104  23.22976  22.20549  26.31445  49.0042  100   a 

编辑关于您在评论中的问题,如果您只是对大数表示法感兴趣,您可以执行以下操作。

plot(1:100, do.call("c", lapply(b(), mean)),
 type= "l", xlab = "replications",
 ylab = "proportion of heads")
abline(h = .5)

在此处输入图像描述

于 2016-08-06T07:00:15.760 回答
0

如果我理解正确,这就是你所追求的:

lapply(1:100, function(x) replicate(x,rbinom(5,1,0.5),simplify = FALSE))
于 2016-08-06T14:59:21.677 回答