3

Rでダブルループを実行することについて、ある種の明白な質問があり、このWebサイトで答えを見つけることができませんでした。私は次のコードを使用しています:

mu <- c(0, .2, .5, .8)
sco <- matrix(nrow = 50, ncol = 4*10)

for (mu in mus) {
  for (i in 1:10) {
    sco[ ,i] <- mu + rnorm(n = 50, mean = 0, sd = 1)
  }
}

現在、mu +乱数を含む10列を取得していますが、取得したいのは40列で、最初の10列はmuが0 +乱数を表し、列11〜20は0.2+乱数を表します。

上記の結果を得るには、コードをどのように変更する必要がありますか?

前もって感謝します!

4

3 に答える 3

4

すべての列の分散が同じになるようではありませんか?50 * 40の標準正規乱数で行列を作成してから、最初の10列に0を追加し、次の10列に0.2を追加してみませんか?!

編集:

例は次のようになります。

result <- matrix(rnorm(50*40,mean=0,sd=1),ncol=40)
mu <- c(rep(0,10),rep(10,10),rep(20,10),rep(30,10))

result <- t(t(result) + mu)

列ごとにベクトルを追加する方法を忘れたため、2つの転置を使用した場合の醜い回避策...そしてmu、結果をより明確にするために、に異なる値を選択しました。

ループソリューションは次のようになります(このコードは使用しませんが、あなたはそれを求めました...)

mus <- c(0, 10, 20, 30)
sco <- matrix(nrow = 50, ncol = 4*10)

for (mu in 1:4) {
  for (i in 1:10) {
    sco[ ,i+(mu-1)*10] <- mus[mu] + rnorm(n = 50, mean = 0, sd = 1)
  }
}
于 2013-02-10T11:38:44.320 に答える
2

私は次のようなことをします:

return_numbers = function(mu_value) {
     matrix(mu_value + rnorm(50 * 10), 50, 10)
  }
dat = do.call("cbind", lapply(mu, return_numbers))

forループを完全にスキップします。最初の10行のすべての数値を一度に生成し、ベクトルのサイズを行列に変更することで、最初のループをスキップします。lapplyを使用して値をループすることにより、2番目のループをスキップしmuます。最後に、私はcbindそれらを1つのデータ構造にまとめるために使用します。

于 2013-02-10T11:39:21.373 に答える
1

rnormパラメータのベクトルを取り、mean行列値を直接計算するために使用できます。

列単位:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=50*10)), nrow=50)

行単位:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=10)), nrow=50, byrow=TRUE)
于 2013-02-10T22:40:33.467 に答える