具有各种 IF 的矢量,加法和减法
Vector with various IFs, adding up and counting down
我有一个向量
x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
现在,如果向量 x 为负,则向量 y 需要累加,当向量 x 为正时,则相反,直到回到零:
y <- c(0,0,-4,-10,-12,-11,-7,-5,-8,-14,-15,-7,0,0,-6,-17)
以下是需要遵守的条件:
负值和正值的累加和只要和小于0
如果和为正数,则停止累计和,直到达到以下负值。
当和变为正数时,打印值为0。
感谢帮助!
x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
for (i in seq_along(x)) { x[i] = ifelse(sum(x[(i-1):i]) > 0, 0, sum(x[(i-1):i])) }
x
# [1] 0 0 -4 -10 -12 -11 -7 -5 -8 -14 -15 -7 0 0 -6 -17
另一种方法是像这样使用 Reduce
:
Reduce(function(u, v) ifelse(sum(c(u, v)) > 0, 0, sum(c(u, v))), x, accumulate = T, init = x[1])[-1]
# [1] 0 0 -4 -10 -12 -11 -7 -5 -8 -14 -15 -7 0 0 -6 -17
如果您想将该过程应用于每一列,您可以使用此示例:
# 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
据我所知,没有办法针对 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 <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
现在,如果向量 x 为负,则向量 y 需要累加,当向量 x 为正时,则相反,直到回到零:
y <- c(0,0,-4,-10,-12,-11,-7,-5,-8,-14,-15,-7,0,0,-6,-17)
以下是需要遵守的条件:
负值和正值的累加和只要和小于0
如果和为正数,则停止累计和,直到达到以下负值。
当和变为正数时,打印值为0。
感谢帮助!
x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
for (i in seq_along(x)) { x[i] = ifelse(sum(x[(i-1):i]) > 0, 0, sum(x[(i-1):i])) }
x
# [1] 0 0 -4 -10 -12 -11 -7 -5 -8 -14 -15 -7 0 0 -6 -17
另一种方法是像这样使用 Reduce
:
Reduce(function(u, v) ifelse(sum(c(u, v)) > 0, 0, sum(c(u, v))), x, accumulate = T, init = x[1])[-1]
# [1] 0 0 -4 -10 -12 -11 -7 -5 -8 -14 -15 -7 0 0 -6 -17
如果您想将该过程应用于每一列,您可以使用此示例:
# 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
据我所知,没有办法针对 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