Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
条件为R的累积和_R - Fatal编程技术网

条件为R的累积和

条件为R的累积和,r,R,说我有 a <- c(0, 22, 0, 2, 0, 0, 20, 20, 20, 0, 0) 有人能帮忙吗?我已经试了很多东西好几个小时了 @霍尔格,这种方法并不总是有效的。 因此,如果我加上几个额外的零,它就不是正确的解决方案 a <- c(0, 22, 0, 2, 0, 0, 0, 0, 20, 20, 20, 0, 0) 这肯定不是一种有效的方法,但可能最容易理解: a <- c(0, 22, 0, 2, 0, 0, 20, 20, 20, 0, 0) ## In

说我有

a <- c(0, 22, 0, 2, 0, 0, 20, 20, 20, 0, 0)
有人能帮忙吗?我已经试了很多东西好几个小时了

@霍尔格,这种方法并不总是有效的。 因此,如果我加上几个额外的零,它就不是正确的解决方案

a <- c(0, 22, 0, 2, 0, 0, 0, 0, 20, 20, 20, 0, 0)

这肯定不是一种有效的方法,但可能最容易理解:

a <- c(0, 22, 0, 2, 0, 0, 20, 20, 20, 0, 0)

## Initialize another vector just like a
c <- a


## Do it easy-to-understand'ly in a for loop:
for (i in seq_along(a)){
  b <- a[i]
  if (i>1) {
    b <- b+c[i-1]
    b <- b-5
  } 
  if (b<0) b <- 0
  if (b>40) b <- 40
  c[i] <- b
  print(c[i])
}
a试试看

cumsum\u up\u low=0&&a[1]low&&out[i-1]+a[i]-d}否则,如果(out[i-1]+a[i]-d,您可以使用
Reduce
获得累积和,并将其与
max
min
pmin
pmax
组合以获得边界

现在还不清楚您是想在累积求和中使用0和40,还是想在之后绑定变量。下面,我提供了这两种可能性

总和内的界限:

Reduce(function(x, y) min(max(x + y - 5, 0), 40), a, 0, accumulate=TRUE)
[1]  0  0 17 12  9  4  0 15 30 40 35 30
求和后绑定

pmin(pmax(Reduce(function(x, y) x + y - 5, a, 0, accumulate=TRUE), 0), 40)
[1]  0  0 12  7  4  0  0  9 24 39 34 29

以下是一些备选方案:

1)循环创建一个单线循环,如下所示:

b <- a; for(i in seq_along(b)[-1]) b[i] <- min(40, max(0, a[i] - 5 + b[i-1]))
b
## [1]  0 17 12  9  4  0 15 30 40 35 30

b非常好。为了得到“-5”,出于兴趣,我会做Reduce(函数(x,y)pmin(pmax(x+y-5,0),b,0,accumulate=TRUE),为什么在“b”后面有“0”?我希望它和我的向量b一样长,所以我想我可以去掉它来达到这个目的!啊,我错过了减法5部分,我要修改我的答案。靠近末尾的0是匿名函数
函数(x,y)
中的“y”。这是一个允许累计总和的填充词。为什么现在这个答案被取消了?结果应始终小于40。我不明白为什么在结果向量的某一点出现1。你能详细说明一下吗?
a <- sample(a, 1e6, TRUE)
system.time(cumsum_up_low(a))
#   user  system elapsed 
#   3.59    0.00    3.59 
library(compiler)
cumsum_up_low_compiled <- cmpfun(cumsum_up_low)
system.time(cumsum_up_low_compiled(a))
#   user  system elapsed 
#   0.28    0.00    0.28 
library(Rcpp)
cppFunction('
NumericVector cumsum_up_low_cpp(NumericVector a, double d, double up, double low) {
  NumericVector out(a.size());
  out[0] = a[0];
  for(int i=1; i<a.size(); i++){
    if(out[i-1] + a[i] - d > low & out[i-1] + a[i] - d < up){
      out[i] = out[i-1] + a[i] - d;
    } else if(out[i-1] + a[i] - d <= low){
      out[i] = 0;          
    } else out[i] = 40;
  }
  return out;
}')

a <- sample(a, 5e6, replace = TRUE)
system.time(cumsum_up_low_compiled(a, d=5, up=40, low=0))
#   user  system elapsed 
#   1.45    0.00    1.46 
system.time(cumsum_up_low_cpp(a, d=5, up=40, low=0))
#   user  system elapsed 
#   0.04    0.02    0.05 
Reduce(function(x, y) min(max(x + y - 5, 0), 40), a, 0, accumulate=TRUE)
[1]  0  0 17 12  9  4  0 15 30 40 35 30
pmin(pmax(Reduce(function(x, y) x + y - 5, a, 0, accumulate=TRUE), 0), 40)
[1]  0  0 12  7  4  0  0  9 24 39 34 29
b <- a; for(i in seq_along(b)[-1]) b[i] <- min(40, max(0, a[i] - 5 + b[i-1]))
b
## [1]  0 17 12  9  4  0 15 30 40 35 30
f <- function(b, a) min(40, max(0, a - 5 + b))
Reduce(f, a, acc = TRUE)
## [1]  0 17 12  9  4  0 15 30 40 35 30
rec <- function(a) {
   n <- length(a)
   if (n <= 1) a
   else {
     rec.hd <- Recall(a[-n])
     c(rec.hd, min(40, max(0, rec.hd[n-1] + a[n] - 5)))
   }
}
rec(a)
## [1]  0 17 12  9  4  0 15 30 40 35 30