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是矢量化的。例如,从初始值开始的 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 回答