5

タイトルは似ていますが、これはR での rep と seq のベクトル化と同じ質問ではありません。

当面の目標: ベクトルが与えられた場合、元の値に加えて、古い値の各値の間に一定間隔の間隔を含む新しいベクトルを生成したいと考えています。これは難しくありません。

1 つの戦略は、より一般的な関数を使用することです。この関数では、2 つのベクトルと指定されたby間隔が与えられ、同じ値を使用して、2 つの元のベクトルからの数値のペアに seq を繰り返し適用しbyます。これを行う組み込み関数は見つかりませんでした。 seqベクトルを引数として扱うことに抵抗があるようです。より一般的な操作を実行する関数を次に示します (すぐに必要な場合に使用できます)。

multiseq <- function(froms, tos, by){
  x <- c(); 
  for (i in seq_along(froms)){
    x <- c(x, seq(from=froms[i], to=tos[i], by=by))
  }
  x
}

例えば:

> multiseq(1:2, 1.75:2.75, .25)
[1] 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75

(これは単なる例です。私が本当に望んでいるのは、任意のシーケンスでこれを行うことです。

-0.89115386 -0.75346155 -0.61576924 -0.47807693 -0.34038463 -0.20269232 -0.06500001  0.07269230  0.21038460  0.34807691  0.48576922  0.62346153  0.76115383

そして、各間隔を 5 つに分割して、5 倍の要素を持つ新しいシーケンスを作成したいと考えています。)

シーケンスが長すぎない限り、ベクターの繰り返し拡張が遅くなりすぎてはいけないと私は信じています。大きなシーケンスが必要な場合は、ベクトルを事前に拡張して埋めるように書き直すことができます。ただし、これをループで行うのはまだ面倒です。より洗練された機能的なプログラミングの R-ly の方法はありますか?

ありがとう。

4

3 に答える 3

16

R で関数をベクトル化する最も簡単な方法の 1 つは、関数を使用するVectorizeことです。

基本的にfromto引数をベクトル化し、すべてのスターターを引数のベクトルとして指定し、from引数に対して同じことを行うことができtoます。

あなたの例を使用すると、このようなことができます

seq2 <- Vectorize(seq.default, vectorize.args = c("from", "to"))

unlist(seq2(from = c(1, 1.75), to = c(2, 2.75), by = 0.25))

## [1] 1.00 1.25 1.50 1.75 2.00 1.75 2.00 2.25 2.50 2.75
于 2013-04-10T05:26:05.447 に答える