2

私の for ループは 1000 の期間に 50 回ごとに実行する必要があります。matlab では、この 1:50:1000 のようなものがあります。R に類似したものはありますか? 1 から 50 ずつ 1000 までお知らせください

4

2 に答える 2

1

編集 - おそらくapply(ループなし)を使用した最もクリーンなソリューション:

apply(stored[seq(1,1000,50), ], 1, yourfunction) # ここで、1 は行を超えることを示します。

モジュロ (ループ) の使用

私の通常のやり方は、モジュロを使用して必要な動作を取得することです。たとえば、繰り返しごとに何らかのアクションを実行しながら、50 回の繰り返しごとに繰り返しを出力します。

stored <- 1:1000
for (i in 1:1000) {
 stored[i] <- rnorm(1)
 if (i %% 50 == 0) { print(i) }
}

これにより、完全な制御が可能になります。別のことを追加することで、たとえば100回の反復ごとに他のことを行うこともできますif i modulo x == 0, then ...

シーケンス メソッドの問題は、ループに効率的に格納できないことです。

stored <- 1:1000
for (i in seq(0,1000,by=50)) {
 stored[i] <- rnorm(1)
 print(i)
}

印刷は問題ありませんが、結果のベクトルは次のようになります。

  [1]          NA          NA          NA          NA          NA          NA
   [7]          NA          NA          NA          NA          NA          NA
  [13]          NA          NA          NA          NA          NA          NA
  [19]          NA          NA          NA          NA          NA          NA
  [25]          NA          NA          NA          NA          NA          NA
  [31]          NA          NA          NA          NA          NA          NA
  [37]          NA          NA          NA          NA          NA          NA
  [43]          NA          NA          NA          NA          NA          NA
  [49]          NA -0.73339457  ....  ...    ... etc

これを解決するには、いくつかの除算も行う必要があるため、通常のループを使用してからモジュロを使用して完全に制御するのが最も効率的であることがわかりました。

使用sapply(ループなし)

コメントで指摘したように、実際に何かを保存したいので、シーケンスをループすると穴が残ります。だからあなたは使うことができますsapply(ファミリーのドキュメントを適用するには、これを読んでください)

通常、sapply(1:1000, function(x) mean(stored[x,]))関数は何でもかまいません。反復ごとに必要な場合は、colMeans などのショートカットがあります。

ただし、シーケンスが必要なためsapply、 を使用して変数引数を与えることができます。

seqMean <- function(x) {
   mean(stored[x,])
}

sapply(seq(1,1000,50), function(x) seqMean(x))

または要するに:

sapply(seq(1,1000,50), seqMean)
于 2013-09-26T07:29:51.687 に答える