在重复结构的同时绘制重复的随机样本,例如在“rep”中(或模仿这种行为)

问题描述 投票:0回答:1

我想根据某些变量动态绘制重复的随机样本

n_times

例如:

n_times <- 2
rep(
  x = rnorm(3),
  times = n_times
)
#> [1] -0.06282421  0.57893598 -0.40280464 -0.06282421  0.57893598 -0.40280464

这里

rep
是先绘制样本,然后重复绘制。我想每次重复时都绘制一个新样本。

在这个极其简单的示例中,我可以将

n_times
填充到
rnorm
中以获得不同的样本:

n_times <- 2
rnorm(n_times * 3)
#> [1]  1.01661877 -1.70475732 -0.01316538 -0.07078134  0.81297461 -0.33472840

但是,我想在列表中重复一系列更复杂的不同样本,动态执行此操作似乎更复杂,例如:

n_times <- 2
rep(
  x = list(
    a = rnorm(1),
    b = rlnorm(3),
    d = matrix(
      data = runif(4),
      nrow = 2
    )
  ),
  times = n_times
)

#> $a
#> [1] 0.8858115
#> 
#> $b
#> [1] 1.439997 1.455555 4.146259
#> 
#> $d
#>           [,1]      [,2]
#> [1,] 0.6682130 0.9883577
#> [2,] 0.7576468 0.7300474
#> 
#> $a
#> [1] 0.8858115
#> 
#> $b
#> [1] 1.439997 1.455555 4.146259
#> 
#> $d
#>           [,1]      [,2]
#> [1,] 0.6682130 0.9883577
#> [2,] 0.7576468 0.7300474

理想情况下,

a
b
d
的每次迭代都将包含新样本。

虽然在

rep
之外动态创建正确数量的样本很容易,但它动态创建一个列表并将它们拟合到我无法理解的位置。通过循环添加似乎是可能的,但非常尴尬。

创建于 2024 年 10 月 1 日,使用 reprex v2.1.0

r
1个回答
0
投票

好的,非常感谢@Iroha 的评论,我可以通过

replicate
实现所需的行为:

n_times <- 2
internal_fun <- function(){
  list(
    a = rnorm(1),
    b = rlnorm(3),
    d = matrix(
      data = runif(4),
      nrow = 2
    )
  )
}

replicate(
  n = n_times,
  expr = internal_fun(),
  simplify = FALSE
)
#> [[1]]
#> [[1]]$a
#> [1] -0.6850743
#> 
#> [[1]]$b
#> [1] 1.9247365 1.4571854 0.7393512
#> 
#> [[1]]$d
#>           [,1]      [,2]
#> [1,] 0.0165695 0.4036282
#> [2,] 0.1592526 0.5828538
#> 
#> 
#> [[2]]
#> [[2]]$a
#> [1] 2.087253
#> 
#> [[2]]$b
#> [1] 2.502234 6.440260 3.318749
#> 
#> [[2]]$d
#>           [,1]      [,2]
#> [1,] 0.7871132 0.6730501
#> [2,] 0.4739253 0.3097537

创建于 2024 年 10 月 1 日,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.