首页 > 解决方案 > 在数据集模拟中循环

问题描述

我希望在 R 中获得以下问题的帮助。

我有以下代码根据指数分布生成 30 列数据集:

x0=0
xmax=8000
xout=3000
lambda=0.0002
n=1

  x1=x0+rexp(n,lambda)-xout
  x2=x1+rexp(n,lambda)-xout
  x3=x2+rexp(n,lambda)-xout
  x4=x3+rexp(n,lambda)-xout
  x5=x4+rexp(n,lambda)-xout
  x6=x5+rexp(n,lambda)-xout
  x7=x6+rexp(n,lambda)-xout
  x8=x7+rexp(n,lambda)-xout
  x9=x8+rexp(n,lambda)-xout
  x10=x9+rexp(n,lambda)-xout
  x11=x10+rexp(n,lambda)-xout
  x12=x11+rexp(n,lambda)-xout
  x13=x12+rexp(n,lambda)-xout
  x14=x13+rexp(n,lambda)-xout
  x15=x14+rexp(n,lambda)-xout
  x16=x15+rexp(n,lambda)-xout
  x17=x16+rexp(n,lambda)-xout
  x18=x17+rexp(n,lambda)-xout
  x19=x18+rexp(n,lambda)-xout
  x20=x19+rexp(n,lambda)-xout
  x21=x20+rexp(n,lambda)-xout
  x22=x21+rexp(n,lambda)-xout
  x23=x22+rexp(n,lambda)-xout
  x24=x23+rexp(n,lambda)-xout
  x25=x24+rexp(n,lambda)-xout
  x26=x25+rexp(n,lambda)-xout
  x27=x26+rexp(n,lambda)-xout
  x28=x27+rexp(n,lambda)-xout
  x29=x28+rexp(n,lambda)-xout
  x30=x29+rexp(n,lambda)-xout

我有三个疑问:

1 - 有没有办法以简化的形式编写这个函数?

2 - 此行(30 列)需要模拟 10,000 次。如何在循环中执行此操作?

3 - 每个单元格(x1,x2,x3 ...)的值必须限制在区间x0和xmax(0-8000)内。这该怎么做?

标签: rsimulationexponentialexponential-distribution

解决方案


这取决于你想对超过 8000 的值做什么。这是一个解决方案,它只采用这些值并用模运算符将它们包装起来。

library(tidyverse)

test <- data.frame(x0 = rep(0, n))
for (i in 1:30) {
  new_col <- sym(paste0("x", i))
  old_col <- sym(paste0("x", i - 1))
  test <- test %>% 
    mutate(!!new_col := (!!old_col + rexp(n, lambda) - xout) %% xmax)
}

我不知道您对 tidyverse 和 tidy 评估可能熟悉或不熟悉,我在这里大量使用了它。运算符与!!结合使用sym(),将变量名转换为实际变量。操作员将%>%数据从一个函数“传送”到下一个函数。:=仅当您想!!在左侧使用 a 进行分配时才需要该运算符。

我认为这是我第一次尝试在 StackOverflow 上发布答案,所以请放轻松!:)


推荐阅读