1

条件付きcumsumをしたいです。Reduce機能が使えると思っていたのですが、できませんでした。明確に説明するには:

a <- rep(1,5)
b <- rnorm(n=5,mean=0.5)
c <- rep(2,5)
d <- rep(0.5,5)

Reduce( '+', a, init=200 , accumulate=TRUE)

結果は

[1] 200 201 202 203 204 205

これは単純な cumsum のようなものです。しかし、私が実際に欲しいのは、条件付きの cumsum です:

再帰は次のように定義されます。

 x0 = 200
 index = 0

 function (x) {
   index = index + 1
   if( x is between 200 and 202 ) return x + a[index]
   else if(x is between 202 and 204) return x + b[index]
   else if(x is between 204 and 206) return x + c[index]
   else return x + d[index]

 }

期待される結果は、このようなものになる可能性があります (もちろん、ランダム性のため、同じになることはありません。

  [1] 200 201 202.3 203.8 204.1 205

興味のある方は、ここで答えを見つけることができます: 単純な再帰関係を関数型プログラムに変換する

モデレーターは、適切なクローズ方法を提案せずに、私が追加したものを削除し続けるため、この質問をクローズ済みとしてマークする方法を見つけることができないようです.

4

1 に答える 1

2

ここは必要ないと思いますReduce。ここでは、次のユースケースを説明する例を示しますReduce

 Reduce(paste,list(1:3,letters[1:3],LETTERS[1:3]))
[1] "1 a A" "2 b B" "3 c C"

私はあなたがxanをしようとしていることは、を使用して行われると思いますifelse、それはベクトル化されています。ここでは、たとえば、init値から始まるaとbの条件付き累積合計です。

a <- rep(1,5)
b <- rep(0.01,5)
init <- 200
x <- seq_along(a)
cumsum(c(init,ifelse( x %% 2 ,a[x],  b[x])))
[1] 200.00 201.00 201.01 202.01 202.02 203.02

もちろん、複数の条件がある場合:

  • 複数の条件を使用します。x %% 2 & x^2 < 5
  • ネストされたものを使用するifelseifelse( x %% 2 ,ifelse(x^2 <2, a[x], b[x]),1)
于 2013-03-15T05:18:23.960 に答える