R 带有各种IFs的向量,加法和倒计时

R 带有各种IFs的向量,加法和倒计时,r,cumulative-sum,R,Cumulative Sum,我有一个向量 x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11) x 如果要将该过程应用于每个列,可以使用以下示例: # example dataset df = data.frame(x = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11), y = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),

我有一个向量

x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
x
如果要将该过程应用于每个列,可以使用以下示例:

# example dataset
df = data.frame(x = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                y = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                z = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11))

# function to update columns
UpdateColumn = function(x) { 
  for (i in seq_along(x)) { x[i] = ifelse(sum(x[(i-1):i]) > 0, 0, sum(x[(i-1):i])) }
  x
                            }

# apply function to each column
# save as data frame
data.frame(sapply(df, UpdateColumn))

#      x   y   z
# 1    0   0   0
# 2    0   0   0
# 3   -4  -4  -4
# 4  -10 -10 -10
# 5  -12 -12 -12
# 6  -11 -11 -11
# 7   -7  -7  -7
# 8   -5  -5  -5
# 9   -8  -8  -8
# 10 -14 -14 -14
# 11 -15 -15 -15
# 12  -7  -7  -7
# 13   0   0   0
# 14   0   0   0
# 15  -6  -6  -6
# 16 -17 -17 -17

我认为这种计算对于矢量化来说并不简单,因为元素以一种非简单的方式依赖于以前的元素,所以最好的方法可能只是使用一个循环:

x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)

y <- pmin(x,0) # gives us the first element correctly, and the correct vector length
for (i in seq_along(x[-1])) y[i+1] <- pmin(y[i] + x[i+1], 0)

y

# [1]   0   0  -4 -10 -12 -11  -7  -5  -8 -14 -15  -7   0   0  -6 -17

x据我所见,没有办法针对R执行此操作。只需使用
for
循环即可

x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
n<-length(x)
y<-numeric(n)
y[1]<-min(x[1],0)
for(i in 2:n){
  y[i]<-min(0,y[i-1]+x[i])
}

 y
 #[1]   0   0  -4 -10 -12 -11  -7  -5  -8 -14 -15  -7   0   0  -6 -17

x我喜欢
pmin
方法:您也可以尝试使用这个
Reduce(函数(u,v)pmin(u+v,0),x,accumulate=T,init=x[1])[-1]
代替for-loop。非常感谢这两种方法!它们工作得很好!我想将此应用于矩阵的所有列(54列)。我尝试过这个:>for(j in 1:ncol(ALL)){for(I in seq_沿着(x)){ALL[I,j]=ifelse(sum(ALL[(I-1):I,])>0,0,sum(ALL[(I-1):I,])}但它不起作用。如果将上述两种方法中的任何一种保存为函数,则很容易将其应用到每一列。如果你不能让它工作,我会更新我的答案与一个例子。它的工作完美!现在,如果我想设置其他条件,应该如何设置?>对于(i在seq_中沿(x)){x[i]=ifelse((sum(x[(i-1):i])>0&(sum(x[(i-1):i]),这都是关于能够更新函数以使用新条件。我不清楚新条件是什么。。。
# example dataset
df = data.frame(x = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                y = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                z = c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11))

# function to update columns
UpdateColumn = function(x) { 
  for (i in seq_along(x)) { x[i] = ifelse(sum(x[(i-1):i]) > 0, 0, sum(x[(i-1):i])) }
  x
                            }

# apply function to each column
# save as data frame
data.frame(sapply(df, UpdateColumn))

#      x   y   z
# 1    0   0   0
# 2    0   0   0
# 3   -4  -4  -4
# 4  -10 -10 -10
# 5  -12 -12 -12
# 6  -11 -11 -11
# 7   -7  -7  -7
# 8   -5  -5  -5
# 9   -8  -8  -8
# 10 -14 -14 -14
# 11 -15 -15 -15
# 12  -7  -7  -7
# 13   0   0   0
# 14   0   0   0
# 15  -6  -6  -6
# 16 -17 -17 -17
x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)

y <- pmin(x,0) # gives us the first element correctly, and the correct vector length
for (i in seq_along(x[-1])) y[i+1] <- pmin(y[i] + x[i+1], 0)

y

# [1]   0   0  -4 -10 -12 -11  -7  -5  -8 -14 -15  -7   0   0  -6 -17
x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
n<-length(x)
y<-numeric(n)
y[1]<-min(x[1],0)
for(i in 2:n){
  y[i]<-min(0,y[i-1]+x[i])
}

 y
 #[1]   0   0  -4 -10 -12 -11  -7  -5  -8 -14 -15  -7   0   0  -6 -17