现在我正在学习如何在 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
..
谁能帮我弥补这个?
现在我正在学习如何在 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
..
谁能帮我弥补这个?
您希望使用 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)
如果我理解正确,这就是你所追求的:
lapply(1:100, function(x) replicate(x,rbinom(5,1,0.5),simplify = FALSE))