使用purrr生成硬币翻转

时间:2016-08-06 06:30:20

标签: r coin-flipping purrr

现在我正在学习如何在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

..

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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)

enter image description here

答案 1 :(得分:0)

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

Components