连续满足条件时如何更改后续行值?

时间:2021-01-21 14:26:27

标签: r dataframe

只是想知道是否有人知道如何在数据帧中满足条件时让 R 更改所有未来的行值?

即假设数据列中有一个负值 - 我希望 R 测试该列的负值和该值以及后续行 0 中的值(无论负值后面的值是否为负)。< /p>

非常感谢!

2 个答案:

答案 0 :(得分:1)

这不是很优雅,但使用“经典”R 效果很好。如果 x 包含数值:

f <- function(x) {
  quel <- which(x < 0)[1]
  if(is.na(quel)) return(x)
  x[quel:length(x)] <- 0
  return(x)
}
apply(x, 2, f)

示例:

x <- as.data.frame(matrix(runif(100,-1,1), ncol=10))
print(x)
print(apply(x, 2, f))

答案 1 :(得分:1)

另一种基本的 R 方法可能是使用 cumsum

考虑以下 data.frame:

data
   V1 V2
1   6 19
2  16  9
3  -1 14
4  18 11
5  19  2
6   1 18
7  11 -1
8  18  1
9  11  7
10  9 19

我们可以使用 cumsum 来确定需要用 0 替换的值:

sapply(data, function(x){cumsum(x <0) > 0})
        V1    V2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,]  TRUE FALSE
 [4,]  TRUE FALSE
 [5,]  TRUE FALSE
 [6,]  TRUE FALSE
 [7,]  TRUE  TRUE
 [8,]  TRUE  TRUE
 [9,]  TRUE  TRUE
[10,]  TRUE  TRUE

从那里开始很容易:

sapply(data, function(x){x[cumsum(x <0) > 0] <- 0; x})
      V1 V2
 [1,]  6 19
 [2,] 16  9
 [3,]  0 14
 [4,]  0 11
 [5,]  0  2
 [6,]  0 18
 [7,]  0  0
 [8,]  0  0
 [9,]  0  0
[10,]  0  0

样本数据:

set.seed(123)
data <- as.data.frame(replicate(2,round(runif(0,20,n= 10),0)))
data[3,1] <- data[7,2] <- -1