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