5

いくつかの特定のプロパティを持つランダムに生成される値のデータセットを作成しようとしています:

  • 0 より大きいすべての正の整数
  • 合計が等しい 2 つの列 (x, y) (sum(x) == sum(y))
  • ほぼ正規分布を持つ

私が望むものに近いデータを生成することに成功しましたが、非常に遅いです。while ループが原因で遅いと思われます。

simSession <- function(sessionid = 1) {
    s <- data.frame(sessionid = sessionid, userid = seq(1:12))
    total <- sample(48:72, 1)

    mu = total / 4
    sigma = 3

    s$x <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s)))
    while(sum(s$x) > total) {
        # i <- sample(nrow(s), 1)
        i <- sample(rep(s$userid, s$x), 1)
        if(s[i, ]$x > 1) {
            s[i, ]$x <- s[i, ]$x - 1
        } else {
            s[i, ]$x = 1
        }
    }

    s$y <- as.integer(rnorm(mean=mu, sd=sigma, n=nrow(s)))
    while(sum(s$y) > sum(s$x)) {
        # i <- sample(nrow(s), 1)
        i <- sample(rep(s$userid, s$y), 1)
        if(s[i, ]$y > 1) {
            s[i, ]$y <- s[i, ]$y - 1
        } else {
            s[i, ]$y = 1
        }
    }

    s$xyr <- s$x / s$y

    return(s)
}

この問題をより簡単にする、またはより高速な代替機能を明らかにするために欠けているものはありますか?

また、モードを左右に歪ませるパラメーターを指定できるというボーナス ポイントもあります。

4

1 に答える 1